1. 程式人生 > 實用技巧 >責任鏈簡單解析

責任鏈簡單解析

責任鏈

責任鏈又叫做職責鏈,是屬於行為型設計模式,它的初衷是為了解決一個事件需要經過多個物件處理是很常見的場景。

  

一個例子

說責任鏈之前,先引入一個場景,假如規定學生請假小於或等於 2 天,班主任可以批准;小於或等於 7 天,系主任可以批准;小於或等於 10 天,院長可以批准;其他情況不予批准;以此為需求,寫一個程式,你會怎麼做?按著過程思維方式,最快最直白的就是,if else嘛,配合java,無非多追加學生類和各個角色的類。下面介紹的設計模式或許會給我們一些啟發。

public class ResponseChain {


    public static void main(String[] args) {
        leader headMaster = new HeadMaster();
        leader classHeader = new classHeader();
        leader dean = new dean();
        headMaster.setNext(classHeader);
        classHeader.setNext(dean);
        headMaster.handlerRequest(2);
        headMaster.handlerRequest(6);
        headMaster.handlerRequest(8);
    }

    static abstract class leader{
        private leader next;

        public leader getNext() {
            return next;
        }

        public void setNext(leader next) {
            this.next = next;
        }

        public abstract  void handlerRequest(int days);
    }

    static class HeadMaster extends leader{

        @Override
        public void handlerRequest(int days) {
            if(days <= 2){
                System.out.println("班主任審批通過,請假+" + days);
            }else {
                if(this.getNext() != null){
                    this.getNext().handlerRequest(days);
                }
                else {
                    System.out.println("請假天數過多,班主任無法審批");
                }
            }
        }
    }

    static class classHeader extends leader{

        @Override
        public void handlerRequest(int days) {
            if(days <= 7){
                System.out.println("系主任審批通過,請假+" + days);
            }else {
                if(this.getNext() != null){
                    this.getNext().handlerRequest(days);
                }
                else {
                    System.out.println("請假天數過多,系主任無法審批");
                }
            }
        }
    }

    static class dean extends leader{

        @Override
        public void handlerRequest(int days) {
            if(days <= 10){
                System.out.println("院長審批通過,請假+" + days);
            }else {
                if(this.getNext() != null){
                    this.getNext().handlerRequest(days);
                }
                else {
                    System.out.println("請假天數過多,院長無法審批");
                }
            }
        }
    }
}