天天看点

设计模式-责任链模式

设计模式-责任链模式

      • 对责任链模式的理解
      • 例子
      • 类图

责任链模式的运用可以使客户端透明的发起服务调用不需要关注具体是哪个环节做发起的调用做具体处理,同样,也方便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);
        }
    }
}
           

继续阅读