开篇:有一阵子没接触代码了,最近在找工作在疯狂复习,复习了一下设计模式,因为项目以前用到责任链模式(当时不是我写的),所以这次复习就特意看了一下,然后看到了一道题
问题:从字典里面选出符合以下三个条件的字符串,(1)包含a或者b或者cd (2)以end结尾 (3)长度大于
正常情况3个if判断搞定的超级简单问题吧
如果(1)(2)(3)是非常复杂的判断 如果字段一些字符串要匹配(1)(3),一些匹配(2)(3)等规则 这时候就可以用到责任链模式了
什么是责任链模式?
这里不多余累赘了,就是红楼梦中的"击鼓传花",具体详见菜鸟教程
https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
思路
实际就是讲题目要求的三种行为统一抽象成为对象,3个行为引用共同实现一个抽象类,抽象类里包含下一个行为的引用(链表的下一个节点)
类图
代码实现
Abstract.class
public abstract class Abstract {
private Abstract nextAbstrarct;
//设置下一个节点
public void setNextAbstrarct(Abstract nextAbstrarct) {
this.nextAbstrarct = nextAbstrarct;
}
//执行方法,遍历节点
public void handle(String str){
find(str);
if(nextAbstrarct != null){
nextAbstrarct.handle(str);
}
}
abstract protected void find(String str);
}
Contain.class
public class Contain extends Abstract {
@Override
public void find(String str) {
if(str.toLowerCase().contains("a") ||
str.toLowerCase().contains("b") ||
str.toLowerCase().contains("cd")){
System.out.println("满足条件1:"+str);
}
}
}
End.class
public class End extends Abstract{
@Override
public void find(String str) {
if(str.endsWith("end")){
System.out.println("满足条件2:"+str);
}
}
}
Len.class
public class Len extends Abstract{
@Override
public void find(String str) {
if(str.length() > 7 ){
System.out.println("满足条件3:" + str);
}
}
}
ChainDemo.class
public static void main(String[] args) {
//实际最好需要一个单独装配的地方,省事直接写这里了
Abstract con = new Contain();
Abstract end = new End();
Abstract len = new Len();
con.setNextAbstrarct(end);
end.setNextAbstrarct(len);
String str[] = new String[]{"abc","oend","pppp","aaa"};
for(String st:str){
con.handle(st);
}
}
输出结果
满足条件1:abc
满足条件2:oend
满足条件1:aaa
总结
也没啥总结的,个人理解就相当于,自己组装一个链子,ABCDEF一条链,处理数据,A处理完(也可能不处理)B处理,写一个简易的demo抛砖引玉吧~
实际我们像之前用的是定时任务地方,要分好多司机每个地方地方要好多判断,代码块太大了不利于维护,后来我们把一些判断的行为,一些处理数据的行为抽象成责任链,层次就非常清晰了,再处理新增逻辑也非常方便简单。