设计模式之职责链模式(JAVA实现)
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式。
主要场景:
小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意。
职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理。依次类推
这里将处理对象抽象为Handler类,经理、总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求
类图如下

下面为具体代码实现:
Handler.java
/**
* 抽象的处理类
* @author GXF
*
*/
public abstract class Handler {
public Handler successor; //后继者,或权限更高的对象
public abstract void handleRequest(int request); //处理客户端请求 public void setSuccesor(Handler successor){ //设置后继者,或者更高权限的对象
this.successor = successor;
} }
ConcreteHandler1.java
/**
* 具体处理类1
* 处理请求范围在1~10之间的请求
* @author GXF
*
*/
public class ConcreteHandler1 extends Handler { @Override
public void handleRequest(int request) {
if(request >=0 && request <= 10){ //在自己的权限范围内,自己处理
System.out.println("ConcreteHandler1 handle request = " + request);
}
else if(successor != null){ //超过自己的权限,如果有更高权限对象,交由其处理
successor.handleRequest(request);
} } }
ConcreteHandler2.java
/**
* 具体处理类
* 处理reqeuest 10~20范围
* @author GXF
*
*/
public class ConcreteHandler2 extends Handler { @Override
public void handleRequest(int request) {
if(request > 10 && request <= 20){ //处理权限范围内的请求
System.out.println("ConcreteHandler2 handle request = " + request);
}
else if(successor != null){ //不能处理的请求,交由权限更高的处理对象处理
successor.handleRequest(request);
}
} }
ConcreteHandler3.java
/**
* 具体处理类3
* 处理request范围:20~30
* @author GXF
*
*/
public class ConcreteHandler3 extends Handler { @Override
public void handleRequest(int request) {
if(request > 20 && request <= 30){
System.out.println("ConcreteHandler3 handle request = " + request);
}
else if(successor != null){
successor.handleRequest(request);
} } }
Client.java
/**
* 职责链模式客户端
* @author GXF
*
*/
public class Client { public static void main(String args[]){
//生成三个权限的处理者对象
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3(); //设置职责链后继者
h1.setSuccesor(h2);
h2.setSuccesor(h3); //生成1-30的数字,作为请求,交由handler处理
int requests[] = new int[30]; //初始化reqeusts数组
for(int i = 0; i < requests.length; i++){
requests[i] = i;
} for(int i = 0 ; i < requests.length; i++){
h1.handleRequest(requests[i]);
}//for } }
设计模式之职责链模式(JAVA实现)的更多相关文章
- 设计模式之第13章-职责链模式(Java实现)
设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...
- php设计模式之职责链模式
<?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...
- 设计模式-利用职责链模式消除if
本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...
- 设计模式:职责链模式(Chain Of Responsibility)
定 义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 深入理解JavaScript系列(38):设计模式之职责链模式
介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
- php实现设计模式之 职责链模式
<?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...
- JS常用的设计模式(15)—— 职责链模式
职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...
- 设计模式之职责链模式(Chain of Responsibility)
职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...
随机推荐
- Maven配置与安装
最近重装了一下系统,便重新安装与配置了maven,记录这个过程并分享出来. 注意:maven安装需要Java依赖,我这里使用的是jdk1.8. 1.安装并配置环境变量 首先在 maven 官网下载 m ...
- Samba服务为例、简单了解
先.关掉SElinux.防火墙. ---------------------------- 安装rpm包(主): samba-3.6.9-164.el6.x86_64.rpm 启动检测:samba服务 ...
- 封装的一个sorted_vector示例,实现了stl::set的一部分接口
STL set能保证最坏情况下的查找和插入效率,logN.但是维护红黑树开销较大.set内的元素按照一定的逻辑顺序组织,查找.插入等操作的结果都和排序规则有关. 适合STL ...
- Jenkins持续集成企业实战系列之Jenkins手动构建-----04
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- 怎样关闭adobe reader的自动更新
https://jingyan.baidu.com/article/1612d5004390ebe20f1eee50.html
- CBoard 看板参数管理
看板设计采用简单Row+Column布局模式,每行总长度为12,每列对应一个图表,行高度可以调节,列高度集成行高 左边栏看板分类中,我的看板为当前用户创建的看板,普通看板分类通过分类管理维护,保存看板 ...
- 添加win10激活工具
其实我们可以随便准备一个win10的激活密钥激活! 以管理员的身份进入到CMD下.. slmgr.vbs /upk 清除掉旧的slmgr /ipk W269N-WFGWX ...
- ELK 实用架构
- day44--浮动和清浮动基本小结
浮动和清浮动 一:浮动 浮动元素会生成一个块级框,而不论它本身是何种元素. 关于浮动的两个特点: 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 由于浮动框不在文档的普 ...
- [SP1825] Free tour II
/* ----------------------- [题解] https://www.luogu.org/blog/IRving1-1/solution-sp1825 --------------- ...