设计模式之职责链模式(JAVA实现)
2016-04-03 23:22
495 查看
学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式。
主要场景:
小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意。
职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理。依次类推
这里将处理对象抽象为Handler类,经理、总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求
类图如下
下面为具体代码实现:
Handler.java
ConcreteHandler1.java
ConcreteHandler2.java
ConcreteHandler3.java
Client.java
主要场景:
小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意。
职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理。依次类推
这里将处理对象抽象为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 } }
相关文章推荐
- json2javabean
- MyEclipse快捷键
- java keytool证书工具使用
- Struts2:搭建原理
- Java double类型保留两位小数的四种方法
- KMP算法实现-java版
- Java---设计模块(工厂方法)
- Java---设计模块(工厂方法)
- 20145312 《Java程序设计》第五周学习总结
- 20145331《Java程序设计》第5周学习总结
- 20145222黄亚奇《Java程序设计》第5周学习总结
- 蛇形矩阵 java实现
- JavaSE学习笔记(2016.4.3)
- 第七章 springboot + retrofit
- 在Eclipse中导入项目的一般方法
- 关于java中==操作和.equals()函数的有趣讨论
- Jvm以及Jvm性能参数优化
- Java并发:await/wait 与sleep、yield间的区别
- servlet api简介(一)
- Spring源码分析篇01——Resource