学习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. linux下用rpm 安装jdk

    转载自http://blog.csdn.net/ldl22847/article/details/7605650 1.下载jdk的rpm安装包,这里以jdk-7u4-linux-i586.rpm为例进 ...

  2. vue模块拖拽效果

    正巧在之前面试中遇到问实现拖拽效果 当时面试的时候简单回答了实现的方式与逻辑. 现在闲来无事,把这个东西实现了一下. 原理很简单,写的很方便. 数据驱动,建立一个数组,数组初始长度为1 拖动触发时,添 ...

  3. bdd相关整理介绍

    BDD介绍 什么是BDD Behavior-driven development In software engineering, behavior-driven development (BDD) ...

  4. 查看 tensorflow 是GPU版本 还是CPU版本

    在Python环境中输入: import os from tensorflow.python.client import device_lib os.environ["TF_CPP_MIN_ ...

  5. 最小生成树----prim算法的堆优化

    题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...

  6. artDialog不能拖拽的问题

    需要引用下面这个文件: https://github.com/aui/artDialog/edit/master/dist/dialog-plus.js

  7. python3.6 request模块和ddt模块的安装

    1.1用cmd命令进到python的安装目录的Scripts文件夹 1.2.然后输入 pip install requests,出现以下提示,说明安装成功 2.安装ddt步骤一样,只是把pip ins ...

  8. idea中使用restclient测试接口发送http请求

    转载:https://jingyan.baidu.com/article/ca41422f0bfd8e1eae99ed31.html

  9. 转 C#对多个集合和数组的操作(合并,去重,判断)

    在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数. 首先举例2个集合A,B. List<int> ...

  10. IDEA查看第三方jar包的源代码时出现Decompiled.class file, bytecode version:52.0 (Java 8)的解决方案

    IDEA中使用Ctrl+左键查看第三方jar包的源代码时,出现Decompiled.class file, bytecode version:52.0 (Java 8),说明IDEA没找到该类的.ja ...