博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之职责链模式
阅读量:5113 次
发布时间:2019-06-13

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

1、定义
职责连模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着链传递该请求,直到由一个对象处理它为止。
 
2、UML
 
ConcreteHandler1、ConcreteHandler2 :具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给他的后继者。
 
 
3、职责链的好处
  • 关键在与当客户提交一个请求时,请求是沿着链传递直至由一个ConcreateHander对象负责处理它
  • 请求者不用管哪个对象来处理,反正该请求会被处理就是了
  • 接受者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用,大大降低了耦合度
  • 我们可以随时的增加或修改一个请求的结构,增强了给对象指派职责的灵活性

4、实例:

 请求类

package com.zcr.chain;//申请public class Request{    //申请类别    private String requestType;        //申请内容    private String requestContent;        //数量    private int number;    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 getNumber()    {        return number;    }    public void setNumber(int number)    {        this.number = number;    }        }
package com.zcr.chain;//管理者public abstract class Manager{    protected String name;        public Manager()    {            }        //管理者的上级    protected Manager superior;        public Manager(String name)    {        this.name = name;    }        //设置管理者的上级    public void SetSuperior(Manager superior)    {        this.superior = superior;    }        //申请请求    abstract public void RequestApplications(Request request);}
package com.zcr.chain;//经理public class Majordomo extends Manager{    public Majordomo(String name)    {        this.name = name;    }        @Override    public void RequestApplications(Request request)    {        //经理所能有的权限就是可准许下属5天内的假期        if(request.getRequestType().equals("请假") && request.getNumber() <= 5)        {            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");        }        else        {            //其余的申请都需转到上级            if(null != superior)            {                superior.RequestApplications(request);            }        }    }}
package com.zcr.chain;//总经理public class GeneralManager extends Manager{    public GeneralManager(String name)    {        this.name = name;    }            @Override    public void RequestApplications(Request request)    {        //总经理允许任意时间假期        if(request.getRequestType().equals("请假"))        {            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");        }        else if(request.getRequestType().equals("加薪") && request.getNumber() <=500)        {            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");        }        else if(request.getRequestType().equals("加薪") && request.getNumber() >500)        {            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"再说把");        }    }    }
package com.zcr.chain;//经理public class CommonManager extends Manager{        public CommonManager(String name)    {        this.name = name;    }    @Override    public void RequestApplications(Request request)    {        //经理所能有的权限就是可准许下属两天内的假期        if(request.getRequestType().equals("请假") && request.getNumber() <= 2)        {            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");        }        else        {            //其余的申请都需转到上级            if(null != superior)            {                superior.RequestApplications(request);            }        }    }}
package com.zcr.chain;public class ChainTest{    public static void main(String[] args)    {        CommonManager jinli = new CommonManager("经理");        Majordomo zongjian = new Majordomo("总监");        GeneralManager zongjingli = new GeneralManager("总经理");                //设置上机,完全根据实际需求来更改设置        jinli.SetSuperior(zongjian);        zongjian.SetSuperior(zongjingli);                Request request = new Request();        request.setRequestType("请假");        request.setRequestContent("XX来请假");        request.setNumber(1);        jinli.RequestApplications(request);                //客户端的申请都是有“经理”发起,但实际上谁来决策由具体管理类来处理,客户端不知道        Request request2 = new Request();        request2.setRequestType("请假");        request2.setRequestContent("XX来请假");        request2.setNumber(4);        jinli.RequestApplications(request2);                Request request3 = new Request();        request3.setRequestType("加薪");        request3.setRequestContent("XX请求加薪");        request3.setNumber(500);        jinli.RequestApplications(request3);                        Request request4 = new Request();        request4.setRequestType("加薪");        request4.setRequestContent("XX请求加薪");        request4.setNumber(1000);        jinli.RequestApplications(request4);    }}

 

 

 5、结果:

 

6、书籍推荐

  《大话设计模式》。上面的例子来自该书的改变,该书通过小菜和大鸟两人在生活中遇到的事情引出设计模式来解决问题,富有趣味性。读起来没那么枯燥无味。

转载于:https://www.cnblogs.com/0201zcr/p/4610320.html

你可能感兴趣的文章
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>