设计模式之责任链模式(Chain of Responsibity)

来源:互联网 发布:淘宝特种经营报名入口 编辑:程序博客网 时间:2024/06/07 01:51

1.解析

定义 :
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

UML :

这里写图片描述


2.实例

背景描述 :
在前面的场景中 ,我们使用的是餐厅的例子 ,在这里可以继续延用 : 薪资问题
人员结构 :
* 基层 : 服务员 ,洗碗工
* 中层 :大厅经理,后厨主任
* 上层 :总经理
* 高层 :老板
* 强级 :老板娘
场景 :
* 基层 : 想要申请 加薪;
* 中层: 最高给 其 加薪 1000元
* 高层 :最高给其加薪 2000元
* 老板 :最高给其加薪 3000元
* 老板娘 : 最高给其加薪 4000元 或者 “ 不干滚蛋 ”

实现步骤 :

层级结构构建 : 管理层实现

(1)实现 SalaryHandler : 抽象类 ,抽象方法 :addSalary(int salary);

public abstract class SalaryHandler {    //用于构建 责任链 的 链 ,是 所有层级(除了基层)的父类    private SalaryHandler salaryHandler;    public SalaryHandler getSalaryHandler() {        return salaryHandler;    }    public void setSalaryHandler(SalaryHandler salaryHandler) {        this.salaryHandler = salaryHandler;    }    public abstract void addSalary(int salary);}

(2)中层人员实现 : 大厅经理 ,后厨主任 ,控制加薪 1000元以内

public class ZhongCengHandler extends SalaryHandler {/** * 中层实现 */    @Override    public void addSalary(int salary) {        if(salary<=1000){            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");        }else{            getSalaryHandler().addSalary(salary);        }    }}

(3)高层人员 : 总经理 ,控制加薪 2000元

public class GaoCengHandler extends SalaryHandler{    /**     * 高层实现     */    @Override    public void addSalary(int salary) {        if(salary<=2000){            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");        }else{            getSalaryHandler().addSalary(salary);        }    }}

(4) Boss 老板 :控制加薪 3000元

public class BossHandler extends SalaryHandler {    /**     * 老板 最多加薪 3000元     *      */    @Override    public void addSalary(int salary) {        if(salary<3000){            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");        }else{            getSalaryHandler().addSalary(salary);        }    }}

(5) BossWife : 老板娘 ,控制加薪4000元 和 辞员

public class BossWifeHandler extends SalaryHandler{    /**     * 老板娘 4000元     * 或 滚蛋     */    @Override    public void addSalary(int salary) {        if(salary<4000){            System.out.println(this.getClass().getName()+" :给您加薪 "+salary+" 元");        }else{            System.out.println(this.getClass().getName()+" : 不干滚蛋 !");        }    }}

层级结构实现 : 关联各个层之间的衔接

(6) SalaryFactory : 使用简单工厂模式 实现 各层之间的关联

public class SalaryFactory {    /**     * 关联起来 所有的 层     */    public static SalaryHandler getSalaryHandlerInstance(){         ZhongCengHandler zhongCengHandler=new ZhongCengHandler();         GaoCengHandler gaoCengHandler=new GaoCengHandler();         BossHandler bossHandler=new BossHandler();         BossWifeHandler bossWifeHandler=new BossWifeHandler();         //关联         zhongCengHandler.setSalaryHandler(gaoCengHandler);         gaoCengHandler.setSalaryHandler(bossHandler);         bossHandler.setSalaryHandler(bossWifeHandler);         return zhongCengHandler;    }}

层级结构实现 : 基层实现

(7) JiCengPerson : 基层人员 实现 申请加薪

public class JiCengPerson {    private String name;    public JiCengPerson(String name) {        this.name = name;    }    /**     * 给上级说     */    public void sayAddSalary(int salary) {        System.out.println(name + " : 我要加薪  " + salary + "元 !!!懂?");        SalaryHandler handler = SalaryFactory.getSalaryHandlerInstance();        handler.addSalary(salary);    }}

测试实现

(8)测试

    public static void main(String[] args) {        //基层提出 加薪        JiCengPerson xw=new JiCengPerson("小王");        xw.sayAddSalary(1100);        JiCengPerson xy=new JiCengPerson("小原");        xy.sayAddSalary(5100);    }

结果 :

这里写图片描述


3.优缺点

优点:
1. 将请求的发送者和接收者解耦 ;
2. 可以简化你的对象,因为它不需要知道链的结构 ;
3. 通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任;

缺点:
1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外 ;
2. 可能不容观察运行时的特征,有碍于除错。
3. 开始就会加载很多实例,消耗内存


4.使用场景

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

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

(3)可处理一个请求的对象集合应被动态指定。


5.Demo 免积分下载

http://download.csdn.net/detail/lablenet/9304489

0 0
原创粉丝点击