一、概念
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。比如生活中购物叠加使用优惠券、打折等。
将请求传给一个接收者链,由链将请求流转给目标对象
1、Calculate方法内,判断next结点不为null,则继续调用next.calculate()
2、客户端调用时,负责初始化整个责任链
PS:当出现多个对象可以处理同一个请求时,适合责任链模式
二、代码示例
实体类
/**
* 水果接口
*/
public interface Fruit {
Double price();
}
public class Apple implements Fruit {
private Double price = 100D;
@Override
public Double price() {
return price;
}
}
public class Banana implements Fruit{
private Double price = 80D;
@Override
public Double price() {
return price;
}
}
public class Orange implements Fruit {
private Double price = 110D;
@Override
public Double price() {
return price;
}
}
折扣链
/**
* 折扣接口
*/
public interface Discount {
// 计算
Double calculate(Double money);
}
/**
* 折扣抽象接类-用于指向下一个折扣
*/
public abstract class AbstractMultiDiscount implements Discount {
// 下一个折扣
protected AbstractMultiDiscount nextMultiDiscount;
public AbstractMultiDiscount(AbstractMultiDiscount nextMultiDiscount) {
this.nextMultiDiscount = nextMultiDiscount;
}
@Override
public Double calculate(Double money) {
if (this.nextMultiDiscount != null) {
return this.nextMultiDiscount.calculate(money);
}
return money;
}
}
/**
* 假日一律减5元
*/
public class HolidayAbstractMultiDiscount extends AbstractMultiDiscount {
public HolidayAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
super(nextAbstractMultiDiscount);
}
@Override
public Double calculate(Double money) {
if (money > 20){
System.out.println("假日一律减5元");
money = money - 5;
}
return super.calculate(money);
}
}
/**
* 第二单9折优惠
*/
public class SecondAbstractMultiDiscount extends AbstractMultiDiscount {
public SecondAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
super(nextAbstractMultiDiscount);
}
@Override
public Double calculate(Double money) {
System.out.println("第二单打9折");
Double balance = money * 0.9;
return super.calculate(balance);
}
}
/**
* 新客折扣
*/
public class NewerAbstractMultiDiscount extends AbstractMultiDiscount {
public NewerAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
super(nextAbstractMultiDiscount);
}
@Override
public Double calculate(Double money) {
if (money > 100){
System.out.println("首次购买减30元");
money = money - 30;
}
return super.calculate(money);
}
}
/**
* 满减折扣
*/
public class FullAbstractMultiDiscount extends AbstractMultiDiscount {
public FullAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
super(nextAbstractMultiDiscount);
}
@Override
public Double calculate(Double money) {
if (money > 200){
System.out.println("优惠满减20元");
money = money - 20;
}
return super.calculate(money);
}
}
购物车
public interface ShoppingCart {
void setDiscount(Discount discount);
void submitOrder();
}
@Data
public class OtherPayShopping implements ShoppingCart{
private List<Fruit> fruits;
private Discount discount;
public OtherPayShopping(List<Fruit> fruits) {
this.fruits = fruits;
}
@Override
public void submitOrder() {
Double total = fruits.stream().mapToDouble(Fruit::price).sum();
System.out.println("总金额:" + total);
Double calculate = discount.calculate(total);
System.out.println("折后的金额---" + calculate);
}
}
客户端
/**
* 订单费用结算过程
*/
public class ChainCartClient {
// 初始化-优惠链条,客户结算优惠顺序,节假日优惠-->第二单优惠-->新客优惠-->满减优惠
// 满减优惠券-no.4
private static AbstractMultiDiscount abstractMultiDiscount = new FullAbstractMultiDiscount(null);
static {
// 新客优惠 指向 满减优惠 no.3
abstractMultiDiscount = new NewerAbstractMultiDiscount(abstractMultiDiscount);
// 第二单9折优惠 指向 新客优惠 no.2
abstractMultiDiscount = new SecondAbstractMultiDiscount(abstractMultiDiscount);
// 节假日优惠 指向 第二单9折优惠 no.1
abstractMultiDiscount = new HolidayAbstractMultiDiscount(abstractMultiDiscount);
}
public static void main(String[] args) {
// 下订单Î
List<Fruit> products = new ArrayList();
products.add(new Apple());
products.add(new Banana());
products.add(new Orange());
// 商品加入购物车
ShoppingCart cart = new OtherPayShopping(products);
// 购物车注入优惠方案链条
cart.setDiscount(abstractMultiDiscount);
// 提交订单,输出结算金额
cart.submitOrder();
}
}