Java设计模式之职责链设计模式
1.什么是-职责链设计模式
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。
2.职责链设计模式的优缺点
1.1优点
1.1.1.责任链模式减低了发出命令的对象和处理命令的对象之间的耦合
1.1.2.它允许多与一个的处理者对象根据自己的逻辑来决定哪一个处理者最终处理这个命令。换言之,发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。
1.1.3.在处理命令上,允许系统有更多的灵活性。哪一个对象最终处理一个命令可以因为由那些对象参加责任链、以及这些对象在责任链上的位置不同而有所不同。
1.2缺点
1.2.1.责任链模式要求链上所有的对象都继承自一个共同的父类或者实现一个共通的接口
1.3.2.所有责任开始都是从指定的接收者依次传递下去,运行中无法从中间开始传递,执行顺序是一条线,如果涉及到的层级较多请求反而无法立即精确的找到处理者,处理效率会降低。
2.设计模式示例
2.1.示例背景
这里的示例是以请假审批做为背景,分别有三层角色:1、boss>2、总经理>3、部门经理>4、请假人。请假人编写请假条并提交给经理,如果请假天数为1天那么部门经理就有权限处理,2天就需要总经理审批了,当大于3天就需要boss审批了。大于5天就超出公司请假规定,不予请假了。这里要先理解层级调用的步骤过程。
2.2.代码区域
2.2.1.请假条类,用来存储请假信息-LeaveRequest.java
/**
* 请假条-申请
*/
public class LeaveRequest {
public LeaveRequest(){}
public LeaveRequest(String name, Integer days) {
this.name = name;
this.days = days;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getDays() {
return days;
} public void setDays(Integer days) {
this.days = days;
} private String name;
private Integer days;
}
2.2.2.抽象类,抽出各个角色共有的动作、审批请假操作-Handle.java
/**
* 抽出角色需要执行的操作
*/
public abstract class Handle {
private Handle hd; public Handle getHd() {
return hd;
} public void setHd(Handle hd) {
this.hd = hd;
} /**
* 验证是否有审批的权力
*/
public abstract void Approval(LeaveRequest leaveRequest); public Handle(Handle hd) {
super();
this.hd=hd;
} /**
*抽出一个公共的权限不足反馈动作
* @param feedback
* @param leaveRequest
*/
public void LackAuthorityFeedback(String feedback,LeaveRequest leaveRequest){
System.out.println(String.format("我是%s,%s请假%s天,我的权限不足,请求上级领导批准。",feedback,leaveRequest.getName(),leaveRequest.getDays()));
this.getHd().Approval(leaveRequest);//通过每一角色类中的构造函数初始化上一级实例对象来调用上一级审批动作
}
}
2.2.3.boss实现类,继承抽象类实现抽象方法审批请假操作-Boss .java
/**
* Created by Administrator on 2017-12-20.
*/
public class Boss extends Handle {
public Boss(Handle hd) {
super(hd);
} @Override
public void Approval(LeaveRequest leaveRequest) {
if(leaveRequest.getDays()<=5){
System.out.println(String.format("我是老板,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
}else{
System.out.println(String.format("我是老板,%s请假%s天,超出公司规定了不予请假",leaveRequest.getName(),leaveRequest.getDays())); }
}
}
2.2.4.GeneralManager总经理实现类,继承抽象类实现抽象方法审批请假操作-GeneralManager .java
/**
* Created by Administrator on 2017-12-20.
*/
public class GeneralManager extends Handle {
/**
* 使用构造函数传递当前对象的上一级-这里是总经理,上一级就是boss
* @param hd
*/
public GeneralManager(Handle hd) {
super(hd);
} @Override
public void Approval(LeaveRequest leaveRequest) {
if(leaveRequest.getDays()==2){
System.out.println(String.format("我是总经理,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
}else{
super.LackAuthorityFeedback("总经理",leaveRequest);
/* System.out.println(String.format("我是总经理经理,%s请假%s天,我的权限不足,请求上级领导批准。",leaveRequest.getName(),leaveRequest.getDays()));
super.getHd().Approval(leaveRequest);//调用上级审批验证*/
}
}
}
2.2.5.Manage经理实现类,继承抽象类实现抽象方法审批请假操作-Manage.java
/**
* Created by Administrator on 2017-12-20.
*/
public class Manage extends Handle {
/**
* 使用构造函数传递当前对象的上一级-这里是经理,上一级就是总经理
* @param hd
*/
public Manage(Handle hd) {
super(hd);
} @Override
public void Approval(LeaveRequest leaveRequest) {
if(leaveRequest.getDays()==1){
System.out.println(String.format("我是部门经理,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
}else{
super.LackAuthorityFeedback("部门经理",leaveRequest);
/* System.out.println(String.format("我是部门经理,%s请假%s天,我的权限不足,请求上级领导批准。",leaveRequest.getName(),leaveRequest.getDays()));
super.getHd().Approval(leaveRequest);//调用上级审批验证*/
}
}
}
2.2.6.测试类,即是请假人类,发起请假操作-RequestTest .java
public class RequestTest {
public static void main(String args[]) {
LeaveRequest leaveRequest = new LeaveRequest("张三", 7);
Handle hdBoss = new Boss(null);//声明一个boss角色并实现抽象方法
Handle hdManager = new GeneralManager(hdBoss);//声明一个总经理角色并传递当前角色的上一级对象实例
Handle manager = new Manage(hdManager);//声明一个经理角色并传递当前角色的上一级对象实例
manager.Approval(leaveRequest);//开始审批请假条信息
}
}
2.3.测试请假
1、请假一天
我是部门经理,张三请假1天,批准了。
Process finished with exit code 0
2、请假2天
我是部门经理,张三请假2天,我的权限不足,请求上级领导批准。
我是总经理,张三请假2天,批准了。 Process finished with exit code 0
3、请假5天
我是部门经理,张三请假5天,我的权限不足,请求上级领导批准。
我是总经理,张三请假5天,我的权限不足,请求上级领导批准。
我是老板,张三请假5天,批准了。 Process finished with exit code 0
3、请假7天
我是部门经理,张三请假7天,我的权限不足,请求上级领导批准。
我是总经理,张三请假7天,我的权限不足,请求上级领导批准。
我是老板,张三请假7天,超出公司规定了不予请假 Process finished with exit code 0
执行思路总结:这就是职责链模式,权限分工明确,当小明想请假1天去相个亲啥的,1天时间部门经理可以有权限给你审批,但是当你相亲成功了想多请一天两天的去一起和对象旅个游啥的,这时请假天数大>1&&<=2时就需要总经理来决定审批权力了。如果一切就绪了想结个婚啥的了。发现用了婚假还不够在请个五天啥的,这个时候加上婚假一玩就是半个月肯定需要老板审批了。如果你觉得再请一周工作日是够的那么老板肯定批了,如果一周工作日还不够肯定老板就不乐意了那老板就会说超出公司规定了。当然如果你是单身狗的话那么你就从一天开始请假得了,先去相个亲啥的。
Java设计模式之职责链设计模式的更多相关文章
- 设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...
- ios框架中UIResponder的职责链设计模式应用
今天有空,就把UIResponder的职责链图上传一下 如果不理解职责链设计模式的朋友,请参考:http://www.cnblogs.com/langtianya/p/4060941.html
- php设计模式之职责链模式
<?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...
- 设计模式-利用职责链模式消除if
本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...
- Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...
- C#设计模式之职责链
Iron之职责链 需求: "Iron"的建造一直没有停止,现在单个部件是有的,但是在部件从工厂里出来的时候,在组装到一起之前,我们还是非常有必要对部件进行质量检测,或者是其它个方面 ...
- 设计模式:职责链模式(Chain Of Responsibility)
定 义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- TypeScript设计模式之职责链、状态
看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...
随机推荐
- 交换知识 VLAN VTP STP 单臂路由
第1章 交换基础 1.1 园区网分层结构 层次 作用 出口层 广域网接入 出口策略 带宽控制 核心层 高速转发 服务器接入 路由选择 汇聚层 流量汇聚 链路冗余 设备冗余 路由选择 接入层 用户接入 ...
- JavaScript 语言精粹读书笔记
最近在看 赵泽欣 / 鄢学鹍 翻译的 蝴蝶书, 把一些读后感言记录在这里. 主要是把作者的建议跟 ES5/ES5.1/ES6 新添加的功能进行了对比 涉及到的一些定义 IIFE: Immediatel ...
- CentOS恢复root口令方法
CentOS6和CentOS7恢复root口令的方法有很大不同 CentOS6: 在引导菜单倒计时界面按任意键,进入grub引导菜单 按e键进入内核引导参数编辑界面 选中kernel项,按e键编辑引导 ...
- SEO内链操作的技巧大家又知道多少
关于一个优质的网站而言,一套优质的内部优化链接体系是必不可少的,简略来说杰出的内链体系能让网站页面之前彼此传递权重,协助搜索引擎快速辨认网站内容的中心,可是SEO内链操作的技巧我们又知道多少?下面齐鲁 ...
- Gmail,QMail,163邮箱的 IMAP/SMTP/POP3 地址
我们在客户端设置邮箱或者使用 PHPMailer 发送邮件的时候,我们都会去查找这些邮箱的 IMAP/SMTP/POP3 地址,这里就列出 Gmail, QMail, 163邮箱这三个常用邮箱的这些地 ...
- Java多线程与并发模型之锁
这是一篇总结Java多线程开发的长文.文章是从Java创建之初就存在的synchronized关键字引入,对Java多线程和并发模型进行了探讨.希望通过此篇内容的解读能帮助Java开发者更好的理清Ja ...
- Java 面试题:百度前200页都在这里了
基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie ...
- Python之hashlib模块
hashlib 在做一个授权管理系统,需要生产动态生成密码,故使用hashlib >>> import time >>> import hashlib >&g ...
- Java Web基础入门
前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...
- 入坑第二式 golang入坑系统
史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...