GOF23的一些总结(十三)

来源:互联网 发布:linux系统查看文件大小 编辑:程序博客网 时间:2024/05/29 03:27

责任链模式:将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递。链上的对象逐个判断能否处理,能处理的话就作处理,不能做处理的传递给下一个对象。
实例举例:java中的异常机制,就是责任链模式,javascript的追踪也是责任链模式,servlet的过滤连,Struts2的请求链接模式。
实例演示:员工请假类

package com.dasenlin.cn;/** * 添加请假事宜 * @author Administrator * */public class LeaveRequest {    private String requestName;    private Integer requestDays;    private String requestReason;    public LeaveRequest(String requestName, Integer requestDays,            String requestReason) {        super();        this.requestName = requestName;        this.requestDays = requestDays;        this.requestReason = requestReason;    }    public LeaveRequest() {        super();    }    public String getRequestName() {        return requestName;    }    public void setRequestName(String requestName) {        this.requestName = requestName;    }    public Integer getRequestDays() {        return requestDays;    }    public void setRequestDays(Integer requestDays) {        this.requestDays = requestDays;    }    public String getRequestReason() {        return requestReason;    }    public void setRequestReason(String requestReason) {        this.requestReason = requestReason;    }}

领导相关关系要处理的类,和处理的事务

package com.dasenlin.cn;public abstract class Leader {    protected String name;    protected Leader nextLeader;    public Leader(String name) {        super();        this.name = name;    }    //责任链上的后继对象    public void setNextLeader(Leader nextLeader) {        this.nextLeader = nextLeader;    }    //抽象方法,处理请求的核心业务的方法    public abstract void handleRequest(LeaveRequest request);}

需要通过的几个领导类
主任

package com.dasenlin.cn;/** * 主任类 * @author Administrator * */public class Director extends Leader {    public Director(String name) {        super(name);    }    @Override    public void handleRequest(LeaveRequest request) {        if(request.getRequestDays()<3){            System.out.println("员工:"+request.getRequestName()+"请假,天数:"+request.getRequestDays()+"理由:"+request.getRequestReason());            System.out.println("主任:"+this.name+"审核通过");        }else{            if(this.nextLeader!=null){                this.nextLeader.handleRequest(request);            }        }    }}

经理

package com.dasenlin.cn;/** * 经理审核 * @author Administrator * */public class Manager extends Leader {    public Manager(String name) {        super(name);    }    @Override    public void handleRequest(LeaveRequest request) {            if(request.getRequestDays()<10){                System.out.println("员工:"+request.getRequestName()+"天数:"+request.getRequestDays()+"原因:"+request.getRequestReason());                System.out.println("经理:"+this.name+"审核通过");            }else{                if(this.nextLeader!=null){                    this.nextLeader.handleRequest(request);                }            }    }}

总经理

package com.dasenlin.cn;/** * 总经理审核 * @author Administrator * */public class GeneralManager extends Leader {    public GeneralManager(String name) {        super(name);    }    @Override    public void handleRequest(LeaveRequest request) {            if(request.getRequestDays()<30){                System.out.println("员工:"+request.getRequestName()+"天数:"+request.getRequestDays()+"原因:"+request.getRequestReason());                System.out.println("总经理:"+this.name+"审核通过");            }else{                System.out.println("莫非:"+request.getRequestName()+"想辞职,居然请假"+request.getRequestDays()+"天");            }    }}

测试类开始

package com.dasenlin.cn;/** * 测试的责任链类 * @author Administrator * */public class Client {    /**     * @param args     */    public static void main(String[] args) {        //设置3个之间的关系        Leader a = new Director("张主任");        Leader b = new Manager("李经理");        Leader c = new GeneralManager("王总");        //组织责任链的关系        a.setNextLeader(b);        b.setNextLeader(c);        //请求假条        LeaveRequest req = new LeaveRequest("诸葛亮",-10,"回去结婚");        a.handleRequest(req);    }}
0 0
原创粉丝点击