设计模式-责任链模式

设计模式-责任链模式

对责任链模式的理解

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

执行结果如图:
在这里插入图片描述

类图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值