天天看點

設計模式梳理——職責鍊模式

一、概述

       職責鍊模式(Chain of Responsibility),使多個對象都有機會處理請求,進而避免發送者與接收者之間的耦合關系,将這個對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有一個對象處理它為止 。

二、UML圖示

設計模式梳理——職責鍊模式

三、代碼實作

1、管理者

public abstract class Manager {

    protected String name;

    //管理者的上級
    protected Manager superior;

    public Manager(String name) {
        this.name = name;
    }
    //設定上級
    public void setSuperior(Manager superior) {
        this.superior = superior;
    }

    //申請請求
    public abstract void requestApplication(RequestMes requestMes);
}
           

2、具體管理者

//經理
public class CommonManager extends Manager {

    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("請假") && requestMes.getRequestNum() < 2){
            System.out.println(name+",您的"+requestMes.getRequestType()+"審批通過,請假天數為:"+requestMes.getRequestNum()+" 準許人:"+this.name);
        }else {
            if (null != superior){
                superior.requestApplication(requestMes);
            }
        }
    }
}

//總監
public class Majordomo extends Manager {

    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("請假") && requestMes.getRequestNum() < 5){
            System.out.println(name+",您的"+requestMes.getRequestType()+"審批通過,請假天數為:"+requestMes.getRequestNum()+" 準許人:"+this.name);
        }else {
            if (null != superior){
                superior.requestApplication(requestMes);
            }
        }
    }
}

//總經理
public class GeneralManager extends Manager {

    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void requestApplication(RequestMes requestMes) {
        if(requestMes.getRequestType().equals("請假") && requestMes.getRequestNum() < 10){
            System.out.println(name+",您的"+requestMes.getRequestType()+"審批通過,請假天數為:"+requestMes.getRequestNum()+" 準許人:"+this.name);
        }else if(requestMes.getRequestType().equals("加薪") && requestMes.getRequestNum() < 1000){
            System.out.println(name+",您的"+requestMes.getRequestType()+"審批通過,加薪數量為:"+requestMes.getRequestNum()+" 準許人:"+this.name);
        }
        else {
            System.out.println("拒絕請求!拒絕人:總經理。");
        }
    }
}
           

3、請求

public class RequestMes {

    private String requestType;

    private String requestContent;

    private int requestNum;

    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 getRequestNum() {
        return requestNum;
    }

    public void setRequestNum(int requestNum) {
        this.requestNum = requestNum;
    }
}
           

4、測試類

public class Test {

    public static void main(String[] args) {
        CommonManager m1 = new CommonManager("aa經理");
        Majordomo m2 = new Majordomo("bb總監");
        GeneralManager m3 = new GeneralManager("cc總經理");

        m1.setSuperior(m2);
        m2.setSuperior(m3);

        RequestMes requestMes1 =new RequestMes();
        requestMes1.setRequestType("請假");
        requestMes1.setRequestContent("小新請假");
        requestMes1.setRequestNum(1);
        m1.requestApplication(requestMes1);

        RequestMes requestMes2 =new RequestMes();
        requestMes2.setRequestType("請假");
        requestMes2.setRequestContent("小新請假");
        requestMes2.setRequestNum(4);
        m1.requestApplication(requestMes2);

        RequestMes requestMes3 =new RequestMes();
        requestMes3.setRequestType("請假");
        requestMes3.setRequestContent("小新請假");
        requestMes3.setRequestNum(8);
        m1.requestApplication(requestMes3);

        RequestMes requestMes4 =new RequestMes();
        requestMes4.setRequestType("加薪");
        requestMes4.setRequestContent("小新加薪");
        requestMes4.setRequestNum(800);
        m1.requestApplication(requestMes4);

        RequestMes requestMes5 =new RequestMes();
        requestMes5.setRequestType("加薪");
        requestMes5.setRequestContent("小新加薪");
        requestMes5.setRequestNum(1800);
        m1.requestApplication(requestMes5);

    }
}

輸出:
aa經理,您的請假審批通過,請假天數為:1 準許人:aa經理
bb總監,您的請假審批通過,請假天數為:4 準許人:bb總監
cc總經理,您的請假審批通過,請假天數為:8 準許人:cc總經理
cc總經理,您的加薪審批通過,加薪數量為:800 準許人:cc總經理
拒絕請求!拒絕人:總經理。
           

注:參考文獻《大話設計模式》程傑著。

繼續閱讀