天天看點

設計模式-責任鍊模式

設計模式-責任鍊模式

      • 對責任鍊模式的了解
      • 例子
      • 類圖

責任鍊模式的運用可以使用戶端透明的發起服務調用不需要關注具體是哪個環節做發起的調用做具體處理,同樣,也友善handler的擴充。

責任鍊模式結合模闆方法模式執行個體:

抽象handler:

public abstract class AbstractHandler {
    /**
     * 黃金會員
     */
    public static final Integer GOLD_VIP = 1;
    /**
     * 鑽石會員
     */
    public static final Integer DIAMOND_VIP = 2;
    /**
     * 榮耀會員
     */
    public static final Integer GLORY_VIP = 3;

    /**
     * next handler
     */
    private AbstractHandler nextHandler;
    /**
     * 自身能處理的類型
     */
    private Integer type;

    public AbstractHandler(Integer _type) {
        this.type = _type;
    }

    public void handlerRequest(IBuyer buyer) {
        if (buyer.getType().equals(this.type)) {
            this.handlerResponse(buyer);
        } else if (this.nextHandler != null) {
            this.nextHandler.handlerRequest(buyer);
        } else {
            System.out.println("未找到相關處理節點");
        }

    }

    /**
     * 消息處理
     */
    public abstract void handlerResponse(IBuyer buyer);

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
}
           

具體handler1

public class DiscountHandler1 extends AbstractHandler{
    public DiscountHandler1() {
        super(AbstractHandler.GOLD_VIP);
    }

    @Override
    public void handlerResponse(IBuyer buyer) {
        System.out.println("目前買家是持有黃金會員卡~!");
        buyer.buy();
        System.out.println("購買成功");
        System.out.println("----------目前處理完畢----------");
    }
}
           

具體handler2

public class DiscountHandler2 extends AbstractHandler{
    @Override
    public void handlerResponse(IBuyer buyer) {
        System.out.println("目前買家是持有鑽石會員卡~!");
        buyer.buy();
        System.out.println("購買成功");
        System.out.println("----------目前處理完畢----------");
    }
    public DiscountHandler2(){
        super(AbstractHandler.DIAMOND_VIP);
    }
}
           

具體handler3

public class DiscountHandler3 extends AbstractHandler{

    public DiscountHandler3() {
        super(AbstractHandler.GLORY_VIP);
    }

    @Override
    public void handlerResponse(IBuyer buyer) {
        System.out.println("目前買家是持有超級無敵榮耀會員卡~!");
        buyer.buy();
        System.out.println("購買成功");
        System.out.println("----------目前處理完畢----------");
    }
}
           

buy接口

public interface  IBuyer {
    /**
     * 得到type
     * @return
     */
    public Integer getType();

    /**
     * 買什麼
     */
    public void buy();
}
           

具體buy

public class ConcreteBuyer implements IBuyer {
    private Integer type;
    private String requsetMessage;

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

    public ConcreteBuyer(Integer type, String message) {
        this.type = type;
        switch (type) {
            case 1:
                this.requsetMessage = "黃金vip" + message;
                break;
            case 2:
                this.requsetMessage = "鑽石vip" + message;
                break;
            case 3:
                this.requsetMessage = "榮耀vip" + message;
                break;
            default:
                this.requsetMessage = message;
        }
    }

    @Override
    public void buy() {
        System.out.println(this.requsetMessage);
    }
}
           
public class Client {
    public static void main(String[] args) {
        Random random = new Random();
        DiscountHandler1 handler1 = new DiscountHandler1();
        DiscountHandler2 handler2 = new DiscountHandler2();
        DiscountHandler3 handler3 = new DiscountHandler3();
        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);
        for (int i = 0; i < 6; i++){
            ConcreteBuyer buyer = new ConcreteBuyer(random.nextInt(3)+1,"想要購買好吃德");
            handler1.handlerRequest(buyer);
        }
    }
}
           

繼續閱讀