设计模式---责任链模式
来源:互联网 发布:青海网络电视台 编辑:程序博客网 时间:2024/05/21 16:59
责任链模式主要是将请求和具体的处理类分开,每一种特定的请求都会有一个具体的负责类来实现。当请求发起时,请求会传递给每一个处理类。处理类判断是否可以处理这个请求,如果不适合处理,则传递给下一个。
实际上,用链这个字,是一个抽象的体现,每一个处理类是通过对象的属性进行关联的。当请求传递给第一个处理类时,会调用处理方法,该方法判断是否适合处理,如果适合的话,则直接处理,如果不适合,则通过该对象的一个属性来获取下一个处理类,并依次进行判断。
写了一个员工向公司提出要求的例子,哈哈,提出的要求可以是来报到,请假,谈薪水,辞职,HR负责新员工报到,supervisor负责请假事务,manager负责处理辞职事务。首先看看这个例子的结构。
1 定义一个员工可以提出的申请接口:
package com.dev.design.chainResponsibility.example;public interface Action {public static final String REGISTER = "register"; // 报到public static final String LEAVE = "leave"; //请假public static final String SALARY = "salary"; //薪水public static final String RESIGNATION = "resignation"; //辞职}
2 需要定义一个处理类和请求类的抽象接口,这样所有的具体实现类,分别实现这个接口。
请求类的抽象接口定义如下:
package com.dev.design.chainResponsibility.example.request;public abstract class AbstractRequest {private String message = null;public AbstractRequest(String message){this.message = message;}public String getMessage() {return message;}public abstract String getRequestLevel();}
处理类的抽象接口定义如下:
package com.dev.design.chainResponsibility.example.handler;import com.dev.design.chainResponsibility.example.request.AbstractRequest;public abstract class AbstractHandler {private AbstractHandler next = null;protected String name = null;public AbstractHandler(String name){this.name = name;}public final void handlerRequest(AbstractRequest request){if(this.getHandlerLevel().equals(request.getRequestLevel())){System.out.println(this.name + " is processing : "+request.getMessage());this.handle(request);}else{System.out.println(this.name + " can not processing : "+request.getMessage());if(this.next != null){this.next.handlerRequest(request);}}}public void setNext(AbstractHandler handler){this.next = handler;}public abstract String getHandlerLevel();public abstract void handle(AbstractRequest request);}
3 各个具体的处理类。
人力资源HR的处理类。
package com.dev.design.chainResponsibility.example.handler;import com.dev.design.chainResponsibility.example.Action;import com.dev.design.chainResponsibility.example.request.AbstractRequest;public class HRHandler extends AbstractHandler {public HRHandler(String name) {super(name);}@Overridepublic String getHandlerLevel() {// TODO Auto-generated method stubreturn Action.REGISTER;}@Overridepublic void handle(AbstractRequest request) {// TODO Auto-generated method stubSystem.out.println(this.name + " is processing all " + request.getMessage());}}
supervisor处理类的实现:
package com.dev.design.chainResponsibility.example.handler;import com.dev.design.chainResponsibility.example.Action;import com.dev.design.chainResponsibility.example.request.AbstractRequest;public class SupervisorHandler extends AbstractHandler {public SupervisorHandler(String name) {super(name);}@Overridepublic String getHandlerLevel() {// TODO Auto-generated method stubreturn Action.LEAVE;}@Overridepublic void handle(AbstractRequest request) {// TODO Auto-generated method stubSystem.out.println(this.name + " is processing all : "+request.getMessage());}}
manager具体类的实现
package com.dev.design.chainResponsibility.example.handler;import com.dev.design.chainResponsibility.example.Action;import com.dev.design.chainResponsibility.example.request.AbstractRequest;public class ManagerHandler extends AbstractHandler {public ManagerHandler(String name) {super(name);// TODO Auto-generated constructor stub}@Overridepublic String getHandlerLevel() {// TODO Auto-generated method stubreturn Action.RESIGNATION;}@Overridepublic void handle(AbstractRequest request) {// TODO Auto-generated method stubSystem.out.println(this.name + " replies to get out for the message....." + request.getMessage());}}
个人请求的具体类实现如下:
package com.dev.design.chainResponsibility.example.request;import com.dev.design.chainResponsibility.example.Action;public class MySelf extends AbstractRequest {public MySelf(String message) {super(message);}@Overridepublic String getRequestLevel() {// TODO Auto-generated method stubreturn Action.RESIGNATION;}}
测试类的实现:
package com.dev.design.chainResponsibility.example;import com.dev.design.chainResponsibility.example.handler.AbstractHandler;import com.dev.design.chainResponsibility.example.handler.HRHandler;import com.dev.design.chainResponsibility.example.handler.ManagerHandler;import com.dev.design.chainResponsibility.example.handler.SupervisorHandler;import com.dev.design.chainResponsibility.example.request.AbstractRequest;import com.dev.design.chainResponsibility.example.request.MySelf;public class Main {public static void main(String[] args) {AbstractHandler hr = new HRHandler("hr");AbstractHandler manager = new ManagerHandler("manager");AbstractHandler supervisor = new SupervisorHandler("supervisor");hr.setNext(supervisor);supervisor.setNext(manager);AbstractRequest request = new MySelf("i want to resignation..");hr.handlerRequest(request);}}
提出辞职请求后,公司的处理结果是
现在说说我的理解。处理类的具体处理逻辑在handle方法中。每一个具体的处理类在handle方法中实现自己的处理逻辑,在getHandlerLevel()方法中实现这个处理类可以处理的具体请求级别。在抽象类中实现循环调用每一个具体类。
从上面运行的结果来看,一个员工提出辞职,HR接到信息后不能处理,然后由supervisor处理,结果还是不能处理,最后转给manager,manager的回复是get out ....
哈哈,设计模式的使用要在实践中来深入理解,我这里也只是初步复习下。
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 设计模式--责任链模式
- 设计模式---责任链模式
- Weka入门教程(3)
- Java中对象的序列化和反序列化方法
- USB转串口 FT232/PL2303/CH340 驱动以及使用体会
- gdal 工具创建金字塔
- CSS3教程:border-image属性
- 设计模式---责任链模式
- hdu 3746
- ASP.NET配合使用uploadify解决Session丢失问题
- MyEclipse快速安装Android ADT,sdk 方法
- 计算数据的平均值、方差和标准差
- 生成一组数据的累积分布
- uva 152 Tree's a Crowd(检索)
- 隐藏Nginx和PHP版本号
- 整理:FPGA选型