学习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实现)的更多相关文章

  1. 设计模式之第13章-职责链模式(Java实现)

    设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...

  2. php设计模式之职责链模式

    <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...

  3. 设计模式-利用职责链模式消除if

    本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...

  4. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

  5. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 深入理解JavaScript系列(38):设计模式之职责链模式

    介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

  7. php实现设计模式之 职责链模式

    <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * 抽象 ...

  8. JS常用的设计模式(15)—— 职责链模式

    职责链模式是一个对象A向另一个对象B发起请求,如果B不处理,可以把请求转给C,如果C不处理,又可以把请求转给D.一直到有一个对象愿意处理这个请求为止. 打个比方,客户让老板写个php程序.老板肯定不写 ...

  9. 设计模式之职责链模式(Chain of Responsibility)

    职责链模式原理: 职责链模式和装饰模式以及组合模式类似的地方是都维持着指向父类的指针, 不同点是职责链模式每个子类都继承父类的指针及每个之类都维持着指向父类的指针,而组合模式与装饰模式是组合类鱼装饰类 ...

随机推荐

  1. 【bzoj3998】弦论 后缀自动机

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  2. POJ-3468-A Simple Problem with Integers(线段树 区间更新 区间和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 139191 ...

  3. 一款很好用的页面滚动元素动画插件-AOS.JS

    aos.js是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态. 加载方法 ...

  4. Eclipse的一下设置

    一.设置自动补全 1.打开 Eclipse -> Window(窗口) -> Perferences(首选项) 2.点开java->Editor(编辑器)->Content A ...

  5. leetcode-229.求众数(二)

     题目: 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为O(n),空间复杂度为O(1). 示例 1: 输入: [3,2,3] 输出: [3 ...

  6. 5、用Numpy实现结构体

    1.结构数组: 在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义结构数组.和C语言一样,在NumPy中也很容易 ...

  7. 分布式中为什么要加入redis缓存的理解

    面我们介绍了mybatis自带的二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存.那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器 ...

  8. os模块与 sys模块

    os模块是与操作系统交互的一个接口 ''' os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作 ...

  9. C++_类和动态内存分配4-有关返回对象的说明

    返回方式: 返回指向对象的引用: 指向对象的const引用: const对象:  =============================================== 返回指向const对象 ...

  10. nodejs下载器,通过chrome代理下载http资源

    var config={ //不想访问的东西,节约流量 "404":[ "http://qidian.qpic.cn/qdbimg" ], //奇数为需要下载的 ...