Java设计模式_(行为型)_责任链模式

引用百科

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。抽象方法handleRequest()规范了子类处理请求的操作。
● 具体处理者(RealHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

案例:

如:有个请假需求,根据不同的请假天数进行不同的审批

<=2天,只项目经理审批 RealHandlerC

>2,<=5天,需要到部门经理审批 RealHandlerB

>5天,需要总经理审批 RealHandlerA

如下:

具体代码实现如下:

1、抽象处理类角色

// 抽象处理者角色类
public abstract class Handler {
 
    /**
     * @Description: 定义处理方法
     * @param date    请假天数
     */
    public abstract void requestHand(int date);
 
    // 过滤器对象
    private Handler resource;
 
    public Handler getResource() {
        return resource;
    }
 
    public void setResource(Handler resource) {
        this.resource = resource;
    }
 
}


2、具体实现类

//具体处理者角色C(项目经理)
public class RealHandlerC extends Handler {
 
    @Override
    public void requestHand(int date) {
        System.out.println("C 条件过滤...");
        if (date <= 2) {
            System.out.println("C处理请求!");
        } else {
            if (this.getResource() != null) {
                System.out.println("天数为" + date + ",C交给下一级处理!");
                this.getResource().requestHand(date);
            }
        }
    }
}
//具体处理者角色B(部门经理)
public class RealHandlerB extends Handler {
    @Override
    public void requestHand(int date) {
        System.out.println("B 条件过滤...");
        if (date <= 5) {
            System.out.println("B处理请求!");
        } else {
            if (this.getResource() != null) {
                System.out.println("天数为" + date + ",B交给下一级处理!");
                this.getResource().requestHand(date);
            }
        }
    }
}
//具体处理者角色A(总经理)
public class RealHandlerA extends Handler {
    @Override
    public void requestHand(int date) {
        System.out.println("A 条件过滤...");
        if (date > 5) {
            System.out.println("A处理请求!");
        } else {
            if (this.getResource() != null) {
                System.out.println("天数为" + date + ",A交给下一级处理!");
                this.getResource().requestHand(date);
            }
        }
    }
}

3、客户端Client测试

public class Client {
 
    private static void vacation() {
        // 组装责任链
        Handler chainA = new RealHandlerA();
        Handler chainB = new RealHandlerB();
        Handler chainC = new RealHandlerC();
 
        // chainC => chainB =>chainA
        chainC.setResource(chainB);
        chainB.setResource(chainA);
 
        // 测试,模拟请假天数进行审批
        chainC.requestHand(1);
        System.out.println("------------分割线------------");
        chainC.requestHand(4);
        System.out.println("------------分割线------------");
        chainC.requestHand(6);
    }
 
    public static void main(String[] args) {
        vacation();
    }
}

以上用请假案例简单的模拟了责任链模式,输出:
C 条件过滤...
C处理请求!
------------分割线------------
C 条件过滤...
天数为4,C交给下一级处理!
B 条件过滤...
B处理请求!
------------分割线------------
C 条件过滤...
天数为6,C交给下一级处理!
B 条件过滤...
天数为6,B交给下一级处理!
A 条件过滤...
A处理请求!


使用说明:
1、使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,
2、将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。


http://www.niftyadmin.cn/n/1555626.html

相关文章

crc16校验c语言程序源码,CRC16校验

[c]代码库//CRC16 checkushort DCSsimulate::CRC16_checksum(uchar *pucFrame, ushort usLen){uchar ucCRCHi 0xFF;uchar ucCRCLo 0xFF;int iIndex;static const uchar aucCRCHi[] { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x…

Java设计模式_(结构型)_享元模式

引用百科 享元模式&#xff08;英语&#xff1a;Flyweight Pattern&#xff09;是一种软件设计模式。它使用共享物件&#xff0c;用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件&#xff1b;它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常…

c语言程序设计的实验报告,c语言程序设计实验报告四

c语言程序设计实验报告四姓名&#xff1a;冷梦龙实验地点&#xff1a;家实验时间&#xff1a;2020.4.12实验项目&#xff1a;5.3.1求数列前n项的和&#xff1b;5.3.2水仙花数&#xff1b;5.3.4十进制转换&#xff1b;5.3.5-1百马百担问题&#xff1b;5.3.5-2求等差数列&#xf…

Java设计模式_(结构型)_装饰模式

引用百科 装饰模式指的是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的功能。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。 特点 &#xff08;1&#xff09; 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象…

单片机控制灯光亮度c语言程序,PIC单片机按键控制PWM输出LED灯亮度C语言程序

#include //调用头文件&#xff0c;可以去PICC软件下去查找PIC16F87XA单片机的头文件__CONFIG(0x3b31); //定义配置字&#xff0c;晶振类型&#xff1a;XT&#xff0c;启动开门狗&#xff0c;禁止低电压编程//**********************************************************…

JMX监控 Tomcat JBoss WebLogic WebSphere配置

说明&#xff1a; 在使用JMX监控服务容器环境数据的时候需要用到各个参数查询名称&#xff0c;以下列出了各个容器下的监控代码以及查询参数名配置&#xff1a; Java实现例子&#xff1a; import javax.management.MBeanServer;try{//如tomcat下获取threadPool信息String sQ…

四川2013年37次c语言笔试考试答案,2013年上海-计算机二级考试C语言试题~.doc

2013年上海-计算机二级考试C语言试题~.doc *B B试卷试卷1、以下程序的功能是输入任意整数n(0 main int i,j,n; char 11 ; printf“Please n“; scanf“d“, fori1;i include define LEN 80 main char str1LEN,str2LEN;int n,i;printf“输入字符串n“;getsstr1;printf“输入子字…

Java设计模式_(结构型)_代理模式

引用百科 即Proxy Pattern&#xff0c;23种常用的面向对象软件的设计模式之一。 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象…