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元