微信号:open_dev

介绍:欢迎关注open软件开发小组;我们专注于android平台上学习类app开发,每周分享Android开发技巧、经验,让我们一起交流学习,共同进步.

Java设计模式精讲(一):责任链模式

2016-07-13 21:52 俊爷

前言
        这篇分享作为一个系列分享的第一篇,主要和大家一起学习一下java设计模式方面的基础,我们现在的安卓开发主要还是基于java语言,所以掌握java本身的基础也是非常重要的。
        在j2ee、web和安卓其他一些java程序开发领域,设计模式被普遍使用,设置模式本身功能并不是体现在优化程序性能,选择一个合适设置模式来构建程序,能让我们的程序整体的设计更加合理,思路更加清晰,在后期面对复杂需求变化能够从容应对,在很大程度上减少代码逻辑性的错误。 这个系列会在后面逐渐分享出来,和大家一起学习进步,暂定包括 责任链模式、享元模式、外观模式、适配器模式、命令模式、中介者模式、观察者模式、状态模式、模版方法模式、访问者模式。后续有机会也会增加其他的。


什么是责任链模式

什么是责任链模式?打个比方类似击鼓传花,花束在每个人手里开始传递,鼓声一落,谁拿到花,谁就要背锅。正式的解释是,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

场景

纯的责任链事例。李四生病了,去大医院看医生,他自己认为是去外科就行,结果去了后外科医生告诉他这个他医不了,让他去耳鼻科看看。于是李四又到了耳鼻科,耳鼻科医生看了下,发现李四的病情严重了,就告诉他这个他搞不定,让他去急症科。于是李四又到了急症科,最后急症科医好了李四的病。

AbstractSickHandler:

public abstract class AbstractSickHandler { private AbstractSickHandler successor; public void setSuccessor(AbstractSickHandler successor) {    this.successor = successor; } protected abstract boolean isMyResponsibility(String illCase); public void handleSick(String personName,String illCase) {    if (isMyResponsibility(illCase)) {        doMyJob(personName,illCase);    } else {        if (!ParamUtils.isNull(successor)) {            successor.handleSick(personName,illCase);        } else {            LogUtil.printWithSystemErr("完蛋了,没救了");        }    } } protected abstract void doMyJob(String personName,String illCase); }

EmergencySickHandler:

public class EmergencySickHandler extends AbstractSickHandler { @Override protected boolean isMyResponsibility(String illCase) {    if(illCase.equals("耳鼻喉科")){        return true;    }    LogUtil.printWithSystemOut("耳鼻喉科医生:不是我的责任");    return false; } @Override protected void doMyJob(String personName, String illCase) {    LogUtil.printWithSystemErr("耳鼻喉科医生:"+personName+", 你这病我能医好,给你开了两服药,按时吃就好了"); }

}

GeneralSurgerySickHandler

public class GeneralSurgerySickHandler extends AbstractSickHandler { @Override protected boolean isMyResponsibility(String illCase) {    if(illCase.equals("普通外科")){        return true;    }    LogUtil.printWithSystemOut("普通外科:不是我的责任");    return false; } @Override protected void doMyJob(String personName, String illCase) {    LogUtil.printWithSystemErr("普通外科医生:"+personName+", 你这病我能医好,给你开了两服药,按时吃就好了"); } }

OtolaryngologySickHandler

public class OtolaryngologySickHandler extends AbstractSickHandler { @Override protected boolean isMyResponsibility(String illCase) {    if(illCase.equals("急诊科")){        return true;    }    LogUtil.printWithSystemOut("急诊科医生:不是我的责任");    return false; } @Override protected void doMyJob(String personName, String illCase) {    LogUtil.printWithSystemErr("急诊科医生:"+personName+", 你这病我能医好,给你开了两服药,按时吃就好了"); } }public class SimplePatternRun implements IPatternRun{ @Override public void run() {    String personName = "李四";    String illCase = "普通外科";    EmergencySickHandler emergencySickHandler = new  EmergencySickHandler();    GeneralSurgerySickHandler generalSurgerySickHandler = new  GeneralSurgerySickHandler();    OtolaryngologySickHandler otolaryngologySickHandler = new  OtolaryngologySickHandler();    emergencySickHandler.setSuccessor(generalSurgerySickHandler);    generalSurgerySickHandler.setSuccessor(otolaryngologySickHandler);    emergencySickHandler.handleSick(personName, illCase); } }

模式优缺点


1) 降低耦合度


该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。


2) 增强了给对象指派职责(Responsibilibty) 的灵活性


当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。


3) 不保证被接受


既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。


模式适用性


A、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

B、你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

C、可处理一个请求的对象集合应被动态指定。


Open软件开发团队
微信号:open_dev
专注于Android开发!


 
Open软件开发小组 更多文章 EventBus初体验 从MVC到MVP,记我的两次项目重构实战经历 中秋节快乐,不发月饼,但也来一波福利 Android系统16ms之内能做些什么 [Android技术专题]动画那点小秘密
猜您喜欢 方寸之间,世纪大战 if(version,startswith("windows 9") Java同步回调函数 Tomcat对SSI的支持 React、Redux 项目工程架构实战