第一步准备一个接口,和多个实现类,以及准备一个消息类
public interface MyFilter {
void doFilter(Msg msg);
}
public class XFilterImpl implements MyFilter{
@Override
public void doFilter(Msg msg) {
String s = msg.getName().replace("a", "A");
msg.setName(s);
}
}
public class XFilterImpl implements MyFilter{
@Override
public void doFilter(Msg msg) {
String s = msg.getName().replace("a", "A");
msg.setName(s);
}
}
public class ZFilterImpl implements MyFilter{
@Override
public void doFilter(Msg msg) {
String s1 = msg.getName().replace("<", "[");
msg.setName(s1);
String s2 = msg.getName().replace(">", "]");
msg.setName(s2);
}
}
//这个类这是用来做被处理对象,不是设计思想的一环
public class Msg {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
'}';
}
}
第二步,新建一个包装类,实现可以顺序执行,可以新增链条类,就像链条环节一节节执行
public class FilterChain {
//重要,这个类需要集合装载实现类,再for遍历执行
private List<MyFilter> filters=new ArrayList<>();
public void doFilter(Msg msg){
for (MyFilter filter : filters) {
filter.doFilter(msg);
}
}
public void addFilter(MyFilter filter){
filters.add(filter);
}
}
第三步,新建客户端检测这个简单的责任链模式,待会在升级高级一点版本
public class Client {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setName("<asdfghj123456>");
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new XFilterImpl());
filterChain.addFilter(new YFilterImpl());
filterChain.addFilter(new ZFilterImpl());
filterChain.doFilter(msg);
System.err.println(msg);
}
}
新增要求可以链式编程
public class FilterChain {
private List<MyFilter> filters=new ArrayList<>();
public void doFilter(Msg msg){
for (MyFilter filter : filters) {
filter.doFilter(msg);
}
}
//把原来返回空的改为返回对象本身
public FilterChain addFilter(MyFilter filter){
filters.add(filter);
return this;
}
}
再新增需求,一个链条实现类在客户端。要求xyz的 FilterChain和abc的 FilterChain可以拼接
//ABC实现类自行参照XYZ书写
public class Client {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setName("<asdfghj123456>");
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new XFilterImpl());
filterChain.addFilter(new YFilterImpl());
filterChain.addFilter(new ZFilterImpl());
FilterChain filterChain2 = new FilterChain();
filterChain.addFilter(new AFilterImpl());
filterChain.addFilter(new BFilterImpl());
filterChain.addFilter(new CFilterImpl());
//后面代码会合并下面2行
filterChain.doFilter(msg);
filterChain2.doFilter(msg);
System.err.println(msg);
}
}
改造FilterChain,也是实现MyFilter,用来合并上面代码提到的合并
public class FilterChain implements MyFilter{
private List<MyFilter> filters=new ArrayList<>();
public FilterChain addFilter(MyFilter filter){
filters.add(filter);
return this;
}
@Override
public void doFilter(Msg msg) {
for (MyFilter filter : filters) {
filter.doFilter(msg);
}
}
}
//分割线--------------------------------------------------------------------------------------
public class Client {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setName("<asdfghj123456>");
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new XFilterImpl())
.addFilter(new YFilterImpl())
.addFilter(new ZFilterImpl());
FilterChain filterChain2 = new FilterChain()
.addFilter(new AFilterImpl())
.addFilter(new BFilterImpl())
.addFilter(new CFilterImpl());
filterChain.addFilter(filterChain2);
filterChain.doFilter(msg);
System.err.println(msg);
}
}
再新增要求,假如有个实现类(xyzabc中的一个)不满足要求直接不要下一环节,类似if的短路处理
public interface MyFilter {
//当为true的时候继续往下执行
boolean doFilter(Msg msg);
}
//修改所有实现了该接口实现类其中最重要FilterChain
public class FilterChain implements MyFilter{
private List<MyFilter> filters=new ArrayList<>();
public FilterChain addFilter(MyFilter filter){
filters.add(filter);
return this;
}
@Override
public boolean doFilter(Msg msg) {
for (MyFilter filter : filters) {
//其中有一个为false,就返回false
if (!filter.doFilter(msg))return false;
}
return true;
}
}
网友评论