博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式梳理——职责链模式
阅读量:4096 次
发布时间:2019-05-25

本文共 4402 字,大约阅读时间需要 14 分钟。

一、概述

       职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免发送者与接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 。

二、UML图示

三、代码实现

1、管理者

public abstract class Manager {    protected String name;    //管理者的上级    protected Manager superior;    public Manager(String name) {        this.name = name;    }    //设置上级    public void setSuperior(Manager superior) {        this.superior = superior;    }    //申请请求    public abstract void requestApplication(RequestMes requestMes);}

2、具体管理者

//经理public class CommonManager extends Manager {    public CommonManager(String name) {        super(name);    }    @Override    public void requestApplication(RequestMes requestMes) {        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 2){            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);        }else {            if (null != superior){                superior.requestApplication(requestMes);            }        }    }}//总监public class Majordomo extends Manager {    public Majordomo(String name) {        super(name);    }    @Override    public void requestApplication(RequestMes requestMes) {        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 5){            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);        }else {            if (null != superior){                superior.requestApplication(requestMes);            }        }    }}//总经理public class GeneralManager extends Manager {    public GeneralManager(String name) {        super(name);    }    @Override    public void requestApplication(RequestMes requestMes) {        if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 10){            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name);        }else if(requestMes.getRequestType().equals("加薪") && requestMes.getRequestNum() < 1000){            System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,加薪数量为:"+requestMes.getRequestNum()+" 批准人:"+this.name);        }        else {            System.out.println("拒绝请求!拒绝人:总经理。");        }    }}

3、请求

public class RequestMes {    private String requestType;    private String requestContent;    private int requestNum;    public String getRequestType() {        return requestType;    }    public void setRequestType(String requestType) {        this.requestType = requestType;    }    public String getRequestContent() {        return requestContent;    }    public void setRequestContent(String requestContent) {        this.requestContent = requestContent;    }    public int getRequestNum() {        return requestNum;    }    public void setRequestNum(int requestNum) {        this.requestNum = requestNum;    }}

4、测试类

public class Test {    public static void main(String[] args) {        CommonManager m1 = new CommonManager("aa经理");        Majordomo m2 = new Majordomo("bb总监");        GeneralManager m3 = new GeneralManager("cc总经理");        m1.setSuperior(m2);        m2.setSuperior(m3);        RequestMes requestMes1 =new RequestMes();        requestMes1.setRequestType("请假");        requestMes1.setRequestContent("小新请假");        requestMes1.setRequestNum(1);        m1.requestApplication(requestMes1);        RequestMes requestMes2 =new RequestMes();        requestMes2.setRequestType("请假");        requestMes2.setRequestContent("小新请假");        requestMes2.setRequestNum(4);        m1.requestApplication(requestMes2);        RequestMes requestMes3 =new RequestMes();        requestMes3.setRequestType("请假");        requestMes3.setRequestContent("小新请假");        requestMes3.setRequestNum(8);        m1.requestApplication(requestMes3);        RequestMes requestMes4 =new RequestMes();        requestMes4.setRequestType("加薪");        requestMes4.setRequestContent("小新加薪");        requestMes4.setRequestNum(800);        m1.requestApplication(requestMes4);        RequestMes requestMes5 =new RequestMes();        requestMes5.setRequestType("加薪");        requestMes5.setRequestContent("小新加薪");        requestMes5.setRequestNum(1800);        m1.requestApplication(requestMes5);    }}输出:aa经理,您的请假审批通过,请假天数为:1 批准人:aa经理bb总监,您的请假审批通过,请假天数为:4 批准人:bb总监cc总经理,您的请假审批通过,请假天数为:8 批准人:cc总经理cc总经理,您的加薪审批通过,加薪数量为:800 批准人:cc总经理拒绝请求!拒绝人:总经理。

注:参考文献《大话设计模式》程杰著。

 

 

 

你可能感兴趣的文章
c++写时拷贝1
查看>>
C++ 写时拷贝 2
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
单列模式-编写类ConfigManager读取属性文件
查看>>
java中float和double的区别
查看>>
Statement与PreparedStatement区别
查看>>
Tomcat配置数据源步骤以及使用JNDI
查看>>
before start of result set 是什么错误
查看>>
(正则表达式)表单验证
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
JSTL 常用标签总结
查看>>
内容里面带标签,在HTML显示问题,JSTL
查看>>
VS编译器运行后闪退,处理方法
查看>>
C语言:模拟实现printf函数——my_printf函数哦
查看>>
一张VIM键盘图,送给大家
查看>>
数据结构:二叉树,二叉树的前中后序、层序遍历(递归法,非递归法),得到一个数叶子节点的个数……
查看>>
数据结构:二叉树线索化
查看>>
基于React ant design 动态路由根据url的动态id,分别不同的页面,并设置默认跳转页面
查看>>
gitlab新建Project后常用提交方式
查看>>