您的位置:首页 > 职场人生

职场小白初涉设计模式之责任链模式

2018-09-02 22:38 453 查看

最近,接到一个需求,在数据计算之前,根据需求的具体内容对数据进行过滤,保留下需要计算的那部分。

对于职场小白没经验的我来说,拿到需求,在确定于什么位置过滤数据以后,就开始义无反顾地码代码!!

怎么码呢?当然是建立需要过滤的接口及实现类,然后在里面进行过滤的具体操作。

由于过滤数据的两部分是对同一内容进行操作,于是在计算数据之前,

嗯,调用第一个实现类方法得到要过滤的内容,循环过滤数据,过滤第一部分;

再来调用第二个实现类方法得到要过滤的内容,循环过滤数据,过滤第二部分。

到这里,需求的功能性基本上算是完成了。但这样的方式好么?!

如果再来第三个第四个相同的过滤操作呢?!接着如上循环么?!

明眼人都能看出来这种方式存在了很大的代码冗余,效率并不是很高,

且后一部分的过滤在前一部分的过滤之后,耦合太紧,以后再看到的话肯定头疼。

于是,在同事亦师父的林哥的耐心指导下,开始以责任链的形式来优化这部分代码。


一、对责任链的理解

责任链模式(Chain of Responsibility Pattern)即为请求创建一个接收者对象的链,给与请求类型,将请求发送者与接收者之间进行解耦。请求的处理被每一个接收者进行接收并处理,如果能处理则按照接收者的既定规则处理,然后在该责任链上层层传递。也可以在每一个接收者中持有下一个接收者的引用,如果自己不能处理,则传给下一个进行处理。

请求由责任链上的每个接收者进行处理,因此,客户在传入请求之后,不需要关心接收者的处理细节以及如何传递的,这就实现了请求的发送者和请求接收者之间进行了解耦。

(一)大致实现

1、首先创建一个Handler类,其包含对请求进行处理的方法HandlerRequest();

2、对于不同的请求处理方式,创建其相应的接收者类,并继承并重写Handler父类中的HandlerRequest()方法,以自己的方式进行实现;

3、对于接收者类的传递上,是在每个接收者类中持有下一接收者的引用,这样处理不了的请求就传递给下一个接收者进行处理。

1 public class Main {
2
3     public static void main(String[] args) {
4         StringObj stringObj = new StringObj("责任链开始,");
5         RuleChain chain = new RuleChain().addRule(new ConcreteHandlerA(stringObj)).addRule(new ConcreteHandlerB(stringObj));
6         chain.handler(stringObj);
7         System.out.println(stringObj.getStr());
8     }
9 }
10
11 ==================================================
12 责任链开始,ConcreteHandlerA接收者开始处理,前面字符串长度为30,ConcreteHandlerB处理完毕,责任链结束


View Code
三、责任链实现的设计模式六大原则体现

如上所示则为一个简答的责任链的大致实现过程。

1、通过上面的例子我们可以看到,每一个类只进行自己的那部分处理方式,符合设计模式的单一职责原则,实现了高内聚低耦合的方针;

2、在Main函数中的main方法中,对于RuleChain来说,我们只需在后续增加各个处理模块即可,然后在每个处理模块中实现自定义处理。在对各个处理模块的增加来说,我们只需实现IRule接口,并重写其handler方法,即可满足需求。这符合设计模式的开闭原则,即对扩展开放,对修改关闭

3、接收者的各个类都统一实现了专门的IRule接口,而不会去实现不必要的其他接口,符合接口隔离原则

4、接收者的handler方法都实现了IRule中的方法,IRule负责抽象方法,而具体的实现细节都放在了各个接收者内部进行处理,符合依赖倒置原则

5、我们从上述例子中可以看到,接收者的类与类之间是不存在耦合的,其链接都是依靠RuleChain来进行的,因此符合迪米特法则,类与类之间的耦合性降低。

6、里氏替换原则在这里暂时不是很明显。

四、其他

大致先说到这里,后续再进行补充。

如有描述不足之处,请指教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: