设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))

简介: 什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象。职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点。

什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象。职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点。

android中事件分发就是责任链模式的具体表现:

View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递。

如何实现责任链模式:

比如责任链上有,A,B,C三个对象,如果A有权限则自己处理,否则传递下去给B,B如果没有权限处理,则传递下去,C如果有权限处理,则处理,否则不处理。

A中有判断的逻辑,一个是符合条件的,自己去处理,一个是不符合自身条件的,交给链条中的下一个对象去处理,B,C一次类推都是同样的道理。

花鼓传花比赛,失败表演节目的例子来讲讲:

 首先创建责任链传递的抽象类:比如下面这个类:

基类,封装处理handler()和指向下一个节点setNextHandler()的方法:

public abstract class Handler {
    protected Handler handler;
    
    public Handler setNextHandler(Handler carHandler) {
        //根据参数指向下一个handler对象
        this.handler = carHandler;
        return this.handler;
    }
    
    //当前对象的实际操作
    public abstract void handler(); 
}

传花同学A:

public class AHandler extends Handler {
    
    @Override
    public void handler() {
        System.out.println("A表演节目");
        if(this.handler != null){
            this.handler.handler();
        }
    }
}

传花同学B:

public class BHandler extends Handler {
    
    @Override
    public void handler() {
        System.out.println("B表演节目");
        if(this.handler != null){
            this.handler.handler();
        }
    }
}

传花同学C:

public class CHandler extends Handler {
    
    @Override
    public void handler() {
        System.out.println("C表演节目");
        if(this.handler != null){
            this.handler.handler();
        }
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Handler aHandler = new AHandler();
        Handler bHandler = new BHandler();
        Handler cHandler = new CHandler();

        System.out.println("-------a==>b==>c--------");
        aHandler.setNextHandler(bHandler);
        bHandler.setNextHandler(cHandler);
        aHandler.handler();
        
        
        System.out.println("1-------b==>a==>c--------");
        bHandler.setNextHandler(aHandler);
        aHandler.setNextHandler(cHandler);
        bHandler.handler();
        
        System.out.println("2-------b==>a==>c--------");
        bHandler.setNextHandler(aHandler).setNextHandler(cHandler);
        bHandler.handler();
    }
    
}

测试结果:

-------a==>b==>c--------
A表演节目
B表演节目
C表演节目
1-------b==>a==>c--------
B表演节目
A表演节目
C表演节目
2-------b==>a==>c--------
B表演节目
A表演节目
C表演节目

 

相关文章
|
2月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
4月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
13天前
|
设计模式 Go
[设计模式 Go实现] 行为型~职责链模式
[设计模式 Go实现] 行为型~职责链模式
|
22天前
|
设计模式 Java
小谈设计模式(25)—职责链模式
小谈设计模式(25)—职责链模式
|
28天前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
14 0
|
3月前
|
设计模式 Java 测试技术
浅谈设计模式 - 责任链模式(十四)
浅谈设计模式 - 责任链模式(十四)
52 0
|
4月前
|
设计模式 SQL Java
设计模式-责任链模式
设计模式-责任链模式
51 0
|
29天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
46 0
|
25天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式