《您的设计模式》(CBF4LIFE)之“责任链模式”【整理】
2016-10-27 13:26
549 查看
背景:中国古代对妇女指定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的。
通过程序描述一下古代妇女的“三从”制度。
父亲、丈夫、儿子每个节点有两个选择:要么承担责任,做出回复;要么把请求转发到后序环节。
三个实现类Father、Husband、Son只要实现构造函数和父类中的抽象方法就可以了,具体怎么处理这些请求,都已经转移到了Handler抽象类中。
1、 抽象类如下:
2、3个实现类
3、 Women的接口与实现类
客户端:
以上讲解的就是责任链模式,你看Father、Husband、Son这三个类的处理女性的请求时,是不是在传递,每个环节只有两个选项:要么承担责任做出回应,要么向下传递请求,最终会有环节做出回应。
`模式在经验中积累的,是知识的结晶,而不是死板硬套的模子。
责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不用知道到底是需要谁来处理的,这是责任链模式的核心。
责任链有一个缺点是大家在开发的时候要注意:调试不是很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。
观察者模式也可以实现请求的传递,比如一个事件发生了,通知了观察者,同时观察者又作为一个被观察者,通知了另外一个观察者,这也形成了一个事件广播链,这和我们今天将的责任链是有区别的:
受众数量不同。观察者广播链式可以1:N的方式广播,而责任链则要求是1:1的传递,必然有一个且只有一个类完成请求的处理;
请求内容不同。观察者广播链中的信息可以在传播中改变,但是责任链中的请求是不可改变的;
处理逻辑不同。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规则进行处理。
通过程序描述一下古代妇女的“三从”制度。
父亲、丈夫、儿子每个节点有两个选择:要么承担责任,做出回复;要么把请求转发到后序环节。
三个实现类Father、Husband、Son只要实现构造函数和父类中的抽象方法就可以了,具体怎么处理这些请求,都已经转移到了Handler抽象类中。
1、 抽象类如下:
package com.teng.pattern.abs; /** * 处理者抽象类 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public abstract class Handler { private int type = 0;//1:未嫁 2:出嫁 3:父死 /** * 下一个处理者 */ private Handler nextHandler; protected Handler(int type){ this.type = type; } /** * 处理女人请求 * @since 1.0 * @param women * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午10:16:43 */ public final void messageHandler(IWomen women){ if(women.getType() == this.type){ this.response(women); }else{ if(this.nextHandler != null){ this.nextHandler.messageHandler(women); }else{ System.out.println("没有处理者。。。。。。。。"); } } } /** * 设置下一个处理者 * @since 1.0 * @param handler * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午9:55:25 */ public void setNextHandler(Handler handler){ this.nextHandler = handler; } /** * 返回请求信息 * @since 1.0 * @param women * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午10:19:17 */ public abstract void response(IWomen women); }
2、3个实现类
package com.teng.pattern.impl; import com.teng.pattern.abs.Handler; import com.teng.pattern.abs.IWomen; /** * 父亲 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public class Father extends Handler { Father(){ super(1); } @Override public void response(IWomen women) { System.out.println("父亲听女儿说。。。。。。"); System.out.println(women.getResponse()); System.out.println("父亲同意。。。。。。"); } } package com.teng.pattern.impl; import com.teng.pattern.abs.Handler; import com.teng.pattern.abs.IWomen; /** * 丈夫 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public class Husband extends Handler { Husband(){ super(2); } @Override public void response(IWomen women) { System.out.println("丈夫听妻子说。。。。。。"); System.out.println(women.getResponse()); System.out.println("丈夫同意。。。。。。"); } } package com.teng.pattern.impl; import com.teng.pattern.abs.Handler; import com.teng.pattern.abs.IWomen; /** * 儿子 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public class Son extends Handler { protected Son() { super(3); } @Override public void response(IWomen women) { System.out.println("儿子听母亲说。。。。。。"); System.out.println(women.getResponse()); System.out.println("儿子同意。。。。。。"); } }
3、 Women的接口与实现类
package com.teng.pattern.abs; /** * 女人 接口 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public interface IWomen { /** * 获取女人类型 * @since 1.0 * @return * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午9:59:50 */ public int getType(); /** * 获取女人的请求信息 * @since 1.0 * @return * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午10:00:08 */ public String getResponse(); }
package com.teng.pattern.abs; /** * 女人实现类 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public class Women implements IWomen { /** * 女人类型 */ private int type = 0; /** * 女人请求信息 */ private String response = ""; /** * 构造器 * @param _type t * @param _response r */ public Women(int _type,String _response){ this.type = _type; switch(this.type){ case 1: this.response = "女儿说 : "+_response; break; case 2: this.response = "妻子说 : "+_response; break; case 3: this.response = "母亲说 : "+_response; } } @Override public int getType() { return this.type; } @Override public String getResponse() { return this.response; } }
客户端:
package com.teng.pattern.impl; import java.util.ArrayList; import java.util.Random; import com.teng.pattern.abs.Handler; import com.teng.pattern.abs.IWomen; import com.teng.pattern.abs.Women; /** * 客户端 * <br>创建日期:2016年8月1日 * <br><b>Copyright 2016 tengxiang All Rights Reserved</b> * @author tengxiang * @since 1.0 * @version 1.0 */ public class Client { /** * 主方法 * @since 1.0 * @param args * <br><b>作者: @author tengxiang</b> * <br>创建时间:2016年8月1日 下午10:28:53 */ public static void main(String[] args) { Random rand = new Random(); ArrayList<IWomen> list = new ArrayList<IWomen>(); for(int i = 0 ;i < 5 ; i++){ list.add(new Women(rand.nextInt(4),"逛街。。。。。。")); } Handler father = new Father(); Handler husband = new Husband(); Handler son = new Son(); father.setNextHandler(husband); husband.setNextHandler(son); for(IWomen women : list){ System.out.println(women.getType()+"-----------------"); father.messageHandler(women); } } }
以上讲解的就是责任链模式,你看Father、Husband、Son这三个类的处理女性的请求时,是不是在传递,每个环节只有两个选项:要么承担责任做出回应,要么向下传递请求,最终会有环节做出回应。
`模式在经验中积累的,是知识的结晶,而不是死板硬套的模子。
责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不用知道到底是需要谁来处理的,这是责任链模式的核心。
责任链有一个缺点是大家在开发的时候要注意:调试不是很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。
观察者模式也可以实现请求的传递,比如一个事件发生了,通知了观察者,同时观察者又作为一个被观察者,通知了另外一个观察者,这也形成了一个事件广播链,这和我们今天将的责任链是有区别的:
受众数量不同。观察者广播链式可以1:N的方式广播,而责任链则要求是1:1的传递,必然有一个且只有一个类完成请求的处理;
请求内容不同。观察者广播链中的信息可以在传播中改变,但是责任链中的请求是不可改变的;
处理逻辑不同。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规则进行处理。
相关文章推荐
- 《您的设计模式》(CBF4LIFE)之“状态模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“访问者模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“工厂方法模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“策略模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“抽象工厂模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“组合模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“桥梁模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“代理模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“多例模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“单例模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“迭代器模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“模板方法模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“适配器模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“建造者模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“装饰模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“门面模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“观察者模式”【整理】
- 《您的设计模式》(CBF4LIFE)之“命令模式”【整理】
- 设计模式之责任链模式_动力节点Java学院整理
- 关于整理出的设计模式系列各方面学习资料