设计模式---责任链模式

来源:互联网 发布:青海网络电视台 编辑:程序博客网 时间: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 ....

哈哈,设计模式的使用要在实践中来深入理解,我这里也只是初步复习下。


        

原创粉丝点击