《大话设计模式》java实现之责任链模式

来源:互联网 发布:四十而知天命 编辑:程序博客网 时间:2024/06/17 16:06

责任链模式各个对象的下一个处理对象在客户端指定,可以自由组合,灵活性强,状态模式各状态则是在编译时设置,即在各状态对象中指定,可对比struts的filter。
另外,书中变量的命名如jingli、zongjian、zongjingli这些是为了让读者区分,实际上不推荐使用拼音命名,我觉得还不如在name属性中设置成经理、总监、总经理比使用金利、宗剑这些要好
UML
这里写图片描述
代码结构
这里写图片描述

public class Client {    public static void main(String[] args) {        CommonManager jinli = new CommonManager("金利");        Majordomo zongjian = new Majordomo("宗剑");        GeneralManager zongjingli = new GeneralManager("钟精励");        jinli.setSuperior(zongjian);        zongjian.setSuperior(zongjingli);        Request request = new Request();        request.setRequestType("请假");        request.setRequestContent("小菜请假");        request.setNumber(1);        jinli.requestApplications(request);        Request request2 = new Request();        request2.setRequestType("请假");        request2.setRequestContent("小菜请假");        request2.setNumber(4);        jinli.requestApplications(request2);        Request request3 = new Request();        request3.setRequestType("加薪");        request3.setRequestContent("小菜请求加薪");        request3.setNumber(500);        jinli.requestApplications(request3);        Request request4 = new Request();        request4.setRequestType("加薪");        request4.setRequestContent("小菜请求加薪");        request4.setNumber(1000);        jinli.requestApplications(request4);    }}
public class CommonManager extends Manager {    public CommonManager(String name) {        super(name);    }    @Override    public void requestApplications(Request request) {        if("请假".equals(request.getRequestType()) && request.getNumber() <= 2) {            System.out.println(name + ":" + request.getRequestContent() + "数量" +                     request.getNumber() + "被批准");        } else {            if(getSuperior() != null) {                getSuperior().requestApplications(request);            }        }    }}
//总经理public class GeneralManager extends Manager {    public GeneralManager(String name) {        super(name);    }    @Override    public void requestApplications(Request request) {        if("请假".equals(request.getRequestType())) {            System.out.println(name + ":" + request.getRequestContent() + "数量" +                     request.getNumber() + "被批准");        } else if("加薪".equalsIgnoreCase(request.getRequestType()) && request.getNumber() <= 500){            System.out.println(name + ":" + request.getRequestContent() + "数量" +                     request.getNumber() + "被批准");        } else if("加薪".equalsIgnoreCase(request.getRequestType()) && request.getNumber() > 500){            System.out.println(name + ":" + request.getRequestContent() + "数量" +                     request.getNumber() + "再说吧");        }    }}
//总监public class Majordomo extends Manager {    public Majordomo(String name) {        super(name);    }    @Override    public void requestApplications(Request request) {        if("请假".equals(request.getRequestType()) && request.getNumber() <= 5                ) {            System.out.println(name + ":" + request.getRequestContent() + "数量" +                     request.getNumber() + "被批准");        } else {            if(getSuperior() != null) {                getSuperior().requestApplications(request);            }        }    }}
public abstract class Manager {    protected String name;    public Manager(String name) {        super();        this.name = name;    }    private Manager superior;    public Manager getSuperior() {        return superior;    }    public void setSuperior(Manager superior) {  //关键的方法        this.superior = superior;    }    public abstract void requestApplications(Request request);}
public class Request {    //申请类别    private String requestType;    //申请内容    private String requestContent;    //数量    private int number;    public String getRequestType() {        return requestType;    }    public void setRequestType(String requestType) {        this.requestType = requestType;    }    public String getRequestContent() {        return requestContent;    }    public void setRequestContent(String requestContent) {        this.requestContent = requestContent;    }    public int getNumber() {        return number;    }    public void setNumber(int number) {        this.number = number;    }}

运行结果
这里写图片描述