设计模式:Chain of Responsibility--职责链模式

职责链模式:

也叫做职责链模式或者职责连锁模式,是行为模式之一,该模式构造了一系列分别担当不同职责的类对来来共同完成一个任务,这些类的对象之间像链条一样紧密相关联所以被称作职责链模式
    

有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。先看看关系图:

Abstracthandler类提供了get和set方法,方便MyHandle类设置和修改引用对象,MyHandle类是核心,实例化后生成一系列相互持有的对象,构成一条链。

关系图 :持有下一步的引用,并设置下一步执行的引用

此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。 

 


    
优缺点:
优点:    1 职责的分担,每个类只需要处理自己改做的工作
(不该处理的传递给下一个),比如组装的车头,车身,车尾,按照顺序执行下去。

明确各类责任范围,符合类的最小封装原则。
2可以根据需要自由组合工作流程,如工作流程发生变化,可以通过重新分配对象
链便可以适应新的工作流程
3 类与类之间可松耦合形式加以组织。

缺点:
因为处理时以链的形式在对象之间传递信息,根据实现的方式布局通,可能hi影响处理速度。

 

 

实例一:

/**
 * 抽象类:组装车的三步,先组装车头,再组装车身,最后组装车尾,持有引用调用
 */
public abstract class CarHandler {

    protected CarHandler carHandler;

    public CarHandler setNextHander(CarHandler carHandler) {
        this.carHandler = carHandler;
        return this.carHandler;
    };

    public abstract void carHandler();
}
**************************************************************************

//头
public class CarHearHandler extends CarHandler{
    @Override
    public void carHandler() {
        System.out.println("组装车头");
        if(this.carHandler != null) {
            this.carHandler.carHandler();
        }
    }
}
**************************************************************************
//body
public class CarBodyHandler extends CarHandler{
    @Override
    public void carHandler() {
        System.out.println("组装车身");
        if(this.carHandler != null) {
            this.carHandler.carHandler();
        }
    }
}

**************************************************************************
//尾
public class CarTailHandler extends CarHandler {
    @Override
    public void carHandler() {
        System.out.println("组装车尾");
        if(this.carHandler != null) {
            this.carHandler.carHandler();
        }
    }
}

*******************************
测试:

public class MainClass {
    public static void main(String[] args) {
        CarHandler carHead  = new CarHearHandler();
        CarHandler carBody = new CarBodyHandler();
        CarHandler carTail =new CarTailHandler();


        //组装顺序预先设定好 :组装车头--》 组装车身--》 组装车尾
        carHead.setNextHander(carBody);
        carBody.setNextHander(carTail);

        //调用职责链头完成任务
        carHead.carHandler();

        /**
         *先执行组装车头,然后此时车头的引用已经变成车身的引用了,然后进入判断调用车身的方法组装车身
         *
         * 组装车身完成后,此时车身的引用已经变成车尾的引用,判断进入然后执行车尾的组装
         *
         * 车尾的组装完成后,此时车尾中的引用为null,不进入下一步,即结束
         */

        System.out.println("******************");

        //简便操作:
        //组装顺序预先设定好 :组装车头--》 组装车身--》 组装车尾

        carHead.setNextHander(carBody).setNextHander(carTail);
        carHead.carHandler();


    }
}

***********************************
测试结果:
组装车头
组装车身
组装车尾
******************
组装车头
组装车身
组装车尾


         先执行组装车头,然后此时车头的引用已经变成车身的引用了,然后进入判断调用车身的方法组装车身
         
         组装车身完成后,此时车身的引用已经变成车尾的引用,判断进入然后执行车尾的组装
         
         车尾的组装完成后,此时车尾中的引用为null,不进入下一步,即结束
        

 

 

实例代码二:

/**
 * Abstracthandler类提供了get和set方法,
 * 方便MyHandle类设置和修改引用对象,MyHandle类是核心,实例化后生成一系列相互持有的对象,
 */

public interface Handler {
    public void operator();
}



*****************************************

public abstract class AbstractHandler {
    private Handler handler;


    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }
}

**********************************************************************************


/**
 * 用一个抽象类持有下一步操作的引用,跟demo1中持有自己的引用是一样的。
 */

public class MyHandler extends AbstractHandler implements Handler {

    private String name;

    public MyHandler(String name) {
        this.name = name;
    }

    @Override
    public void operator() {
        System.out.println(name+":operator detail!");
        if(getHandler() != null){
            getHandler().operator();
        }

    }
}


**********************************************************************************


/**
 * 职责链设计模式,当前操作持有下一步操作的引用
 * 此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,
 * 模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。
 */
public class MainClass {

    public static void main(String[] args) {
        MyHandler h1 = new MyHandler("H1");
        MyHandler h2 = new MyHandler("H2");
        MyHandler h3 = new MyHandler("H3");
        MyHandler h4 = new MyHandler("H4");
        MyHandler h5 = new MyHandler("H5");

        h1.setHandler(h2);
        h2.setHandler(h3);
        h3.setHandler(h4);
        h4.setHandler(h5);

        h1.operator();
    }

}
*************************
测试结果:
H1:operator detail!
H2:operator detail!
H3:operator detail!
H4:operator detail!
H5:operator detail!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值