设计模式(十一):责任链模式(行为型模式)

Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系

责任链模式的类结构

责任链模式由多个对象组成,每个对象都可以选择性地处理请求,并将请求传递给链中的下一个处理器。其结构包括以下几个要素:

抽象处理者(Handler):定义了一个处理请求的接口,并维护一个指向下一个处理器的引用;

具体处理者(Concrete Handler):实现了处理请求接口,如果能够处理请求则直接处理,否则将请求转发给下一个处理器;

客户端(Client):创建和组装责任链,并向其提交请求。

常用的比如java web里面的filter,定义了多个filter,会按照优先级依次执行。本次模拟的场景是电商里面的折扣优惠处理链条。类图如下所示:

上代码:

package com.figo.study2024.pattern.chain;
/**
 * Created by figo 20240316
 * 责任链处理器父类
 */
public abstract class DiscountHandler {
    protected DiscountHandler nextDiscountHandler;

    public DiscountHandler(DiscountHandler nextDiscountHandler){
        this.nextDiscountHandler = nextDiscountHandler;
    }

    public int calculate(int money,boolean isNewer){
        if (this.nextDiscountHandler != null){
            return this.nextDiscountHandler.calculate(money,isNewer);
        }
        return money;
    }

}


package com.figo.study2024.pattern.chain;

/**
 * 满减优惠
 */
public class FullDiscountHandler extends DiscountHandler {
    public FullDiscountHandler(DiscountHandler nextDiscountHandler) {
        super(nextDiscountHandler);
    }

    @Override
    public int calculate(int money,boolean isNewer) {
        if (money > 200){
            System.out.println("满200减20元");
            money = money - 20;
        }
        return super.calculate(money,isNewer);
    }
}


package com.figo.study2024.pattern.chain;

/**
 * 假日购优惠
 */
public class HolidayDiscountHandler extends DiscountHandler {
    public HolidayDiscountHandler(DiscountHandler nextDiscountHandler) {
        super(nextDiscountHandler);
    }

    @Override
    public int calculate(int money,boolean isNewer) {
        if (money > 50){
            System.out.println("假日一律减10元");
            money = money - 10;
        }
        return super.calculate(money, isNewer);
    }
}


package com.figo.study2024.pattern.chain;

/**
 * 首次购优惠
 */
public class NewerDiscountHandler extends DiscountHandler {
    public NewerDiscountHandler(DiscountHandler nextDiscountHandler) {
        super(nextDiscountHandler);
    }

    @Override
    public int calculate(int money,boolean isNewer) {
        if ((money > 100)&&isNewer){
            System.out.println("首次购买减30元");
            money = money - 30;
        }
        return super.calculate(money,isNewer);
    }
}





package com.figo.study2024.pattern.chain;


/**
 * 责任链模式客户端调用
 * 优惠计算链条
 */
public class PatternTest {
    public static void main(String[] args) {
        //客户端调用时,组装好链条
        //新用户优惠处理器,没有定义下一个处理器
        DiscountHandler newerDiscountHandler = new NewerDiscountHandler(null);
        //假期优惠处理器的下一个处理器是新用户优惠处理器
        DiscountHandler holidayDiscountHandler = new HolidayDiscountHandler(newerDiscountHandler);
        //满减优惠处理器后的下一个处理器是假期优惠处理器
        DiscountHandler fullDiscountHandler = new FullDiscountHandler(holidayDiscountHandler);
        //通过调用第一个处理器来执行
        fullDiscountHandler.calculate(300,true);
    }
}


运行结果:
满200减20元
假日一律减10元
首次购买减30元

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>