1. 程式人生 > >Java設計模式一 責任鏈模式

Java設計模式一 責任鏈模式

​ 一直都想對設計模式有一個深刻的認識,這樣對於閱讀原始碼的時候就不會那麼吃力了。於是有了想要記錄下設計模式的筆記。打算從自己不怎麼熟悉的設計模式開始寫,裡面穿插著一點自己的想法,希望自己寫完後,會又一個更深刻的理解和流暢的表述。

介紹

​ 為請求建立了一個接受者的鏈,通常一個接收者包含下一個接受者的引用,如果該物件不能處理該請求,就傳給下一個。依次類推,直到有處理的物件為止。

應用例項:jsp servlet的Filter,js中的事件冒泡

例子

​ 通過一個例子來深刻的認識他。以前古代女子都遵從著三從四德,三從:一從父親,二從丈夫,三從兒子。

也就是在家聽父親的,嫁人後,聽丈夫的,喪夫後,聽兒子的。

​ 那麼現在呢,人人平等,那麼我就說以後吧,一步小心就是男子三從四德了,那麼針對男子進行三從四德進行程式碼演練。一男子想買鍵盤,先從母親開始問起,如果母親不想理你 ,你就問你妻子,你妻子不理你,你就問你女兒,你女兒也不理,你就啥也不能買。

程式碼

  • 抽象未來男子人類

/**
 * @ClassName Human
 * @Description 人類
 * @Author ouyangkang
 * @Date 2018-11-05 10:02
 **/
public abstract class Human {
    /**
     * @Author ouyangkang
     * @Description 發起請求
     * @Date 10:04 2018/11/5
     * @param
     * @return void
    **/
    public abstract void request();

    /**
     * @Author ouyangkang
     * @Description 獲取請求的型別
     * @Date 10:05 2018/11/5
     * @param
     * @return java.lang.Integer
    **/
    public abstract Integer getType();
}
  • 具體實現

/**
 * @ClassName Man
 * @Description 未來男子
 * @Author ouyangkang
 * @Date 2018-11-05 10:07
 **/
public class Man extends Human {

    /**
     * @Date 2018/11/5 10:09
     * @Description 請求
     **/
    private String request;


    /**
     * @Date 2018/11/5 10:14
     * @Description 1 為入贅 2 已入贅 3 喪妻
     **/
    private Integer type ;

    @Override
    public void request() {
        System.out.println(request);
    }

    @Override
    public Integer getType() {
        return this.type;
    }


    public Man(String request, Integer type){
        this.request = request;
        this.type = type;
    }
}
  • 處理抽象鏈

/**
 * @ClassName Handler
 * @Description  責任鏈
 * @Author ouyangkang
 * @Date 2018-11-05 10:15
 **/
public abstract class Handler {


    public static final Integer MOTHER_LEVEL = 1;

    public static final Integer WIFE_LEVEL = 2;

    public  static final Integer DAUGHTER_LEVEL = 3;

    public  Integer level;

    /**
     * @Date 2018/11/5 10:16
     * @Description 下一個處理者
     **/
    private Handler nexHandler;

    public Handler(Integer level){
        this.level = level;
    }


    /**
     * @Author ouyangkang
     * @Description 處理資訊
     * @Date 10:27 2018/11/5
     * @param human
     * @return void
    **/
    public void handleMessage(Human human){
        if (this.level.equals(human.getType())){
            this.response(human);
        }else {
            if (nexHandler != null){
                //傳遞給下一個處理物件
                this.nexHandler.handleMessage(human);
            }else {
                System.out.println("---------------");
                human.request();
                System.out.println("沒有處理的人了");
            }

        }
    }

    /**
     * @Author ouyangkang
     * @Description 回覆未來男子的請求
     * @Date 10:18 2018/11/5
     * @param
     * @return void
    **/
    public abstract void response(Human human);


    public void setNexHandler(Handler nexHandler){
        this.nexHandler = nexHandler;
    }
}
  • 具體實現
/**
 * @ClassName Mather
 * @Description 母親
 * @Author ouyangkang
 * @Date 2018-11-05 10:28
 **/
public class Mather extends Handler {


    public Mather(){
        super(Handler.MOTHER_LEVEL);
    }

    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("媽媽愛你 當然同意啦");
    }
}

/**
 * @ClassName Wife
 * @Description TODO
 * @Author ouyangkang
 * @Date 2018-11-05 10:46
 **/
public class Wife extends Handler {

    public Wife() {
        super(Handler.WIFE_LEVEL);
    }

    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("");
    }
}
/**
 * @ClassName Wife
 * @Description TODO
 * @Author ouyangkang
 * @Date 2018-11-05 10:46
 **/
public class Wife extends Handler {

    public Wife() {
        super(Handler.WIFE_LEVEL);
    }

    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("上次你那個機械鍵盤不是還能用嗎 不給買");
    }
}
/**
 * @ClassName Daughter
 * @Description TODO
 * @Author ouyangkang
 * @Date 2018-11-05 10:48
 **/
public class Daughter extends Handler {

    public Daughter() {
        super(Handler.DAUGHTER_LEVEL);
    }

    @Override
    public void response(Human human) {
        System.out.println("-----------------");
        human.request();
        System.out.println("給糖吃就同意");
    }
}
  • 客戶端
/**
 * @ClassName Main
 * @Description TODO
 * @Author ouyangkang
 * @Date 2018-11-05 10:49
 **/
public class Main {
    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0 ;i < 5;i++){
            Human human = new Man("我要買鍵盤", random.nextInt(4));
            Handler mather = new Mather();
            Handler wife = new Wife();
            Handler daughter = new Daughter();
            mather.setNexHandler(wife);
            wife.setNexHandler(daughter);
            mather.handleMessage(human);

        }

    }
}
  • 返回結果
-----------------
我要買鍵盤
給糖吃就同意
-----------------
我要買鍵盤
上次你那個機械鍵盤不是還能用嗎 不給買
-----------------
我要買鍵盤
上次你那個機械鍵盤不是還能用嗎 不給買
-----------------
我要買鍵盤
媽媽愛你 當然同意啦
---------------
我要買鍵盤
沒有處理的人了