package com.cheng.zenofdesignpatterns.patterns.chainofresponsibility; import android.view.View; import com.cheng.zenofdesignpatterns.ZoDPChapterBaseActivity; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.Father; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.WomanHandler; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.Husband; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.IWomen; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.Son; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.ancientfemale.Women; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.ConcreteHandler1; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.ConcreteHandler2; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.ConcreteHandler3; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.AbstractHandler; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.Request; import com.cheng.zenofdesignpatterns.patterns.chainofresponsibility.common.Response; import java.util.ArrayList; import java.util.Random; public class ChainofResponsibilityActivity extends ZoDPChapterBaseActivity { @Override protected void initData() { mTitleTV.setText("责任链模式"); String content = "定义:\n" + "Avoid coupling the sender of a request to its receiver by giving more than " + "one object a chance to handler the request. Chain the receiving objects and " + "pass the request along the chain until an object handles it.\n" + "使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象" + "连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。\n\n" + "责任链模式的优点\n" + "非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请" + "求的全貌,两者解耦,提高系统的灵活性。\n" + "责任链模式的缺点\n" + "有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的" + "时候,性能是一个非常大的问题。二是调试不是很方便,特别是链条比较长,环节比较多的时候," + "由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。\n\n" + "注意事项\n" + "链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点" + "数量,在setNext方法中判断是否已经是超过其阈值,超过则不允许该链建立,避免无意识地破" + "坏系统性能。\n\n" + "最佳实践\n" + "在例子和通用源码中Handler是抽象类,融合了模板方法模式,每个实现类只要实现两个方法:" + "echo方法处理请求和getHandleLevel获得处理级别,想想单一职责原则和迪米特法则吧,通过" + "融合模板方法模式,各个实现类只要关注自己的业务逻辑就成了,至于说什么事要自己处理,那" + "就让父类去决定好了,也就是说父类实现了请求传递的功能,子类实现请求的处理,符合单一职" + "责原则,各个类只完成一个动作或逻辑,也就是只有一个原因引起类的改变,建议在使用的时候" + "用这种方法,好处非常明显了,子类的实现非常简单,责任链的建立也是非常灵活的。"; mContentTV.setText(content); } @Override public void onClick(View v) { // 1. 模拟古代女性的三从四德 // 随机挑选几个女性 Random rand = new Random(); ArrayList<IWomen> arrayList = new ArrayList<>(); for (int i = 0; i < 5; i++) { arrayList.add(new Women(rand.nextInt(4), "我要出去逛街")); } // 定义三个请示对象 WomanHandler father = new Father(); WomanHandler husband = new Husband(); WomanHandler son = new Son(); // 设置请示顺序 father.setNext(husband); husband.setNext(son); for (IWomen women : arrayList) { father.handleMessage(women); } // 2. 通用责任链模式演示 // 声明出所有的处理节点 AbstractHandler handler1 = new ConcreteHandler1(); AbstractHandler handler2 = new ConcreteHandler2(); AbstractHandler handler3 = new ConcreteHandler3(); // 设置链中的阶段顺序,1-->2-->3 handler1.setNext(handler2); handler2.setNext(handler3); // 提交请求,返回结果 Response response = handler1.handleMessage(new Request()); /** * 在实际应用中,一般会有一个封装类对责任链模式进行封装,也就是替代场景类,直接返回 * 链中的第一个处理者,具体链的设置不需要高层次模块关心,这样更简化了高层次模块的 * 调用,减少模块间的耦合,提高系统的灵活性。 */ } }