FullDiscount
Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,
并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
场景:购物车结算时,根据不同的客户,计算不同的折扣策略,先定义个折扣策略基类Discount,各种不同的折扣定义子类来继承。根据实际的情况,再将折扣策略传给购物车对象进行订单的结算。
类图:
PatterTest类调用购物车ShoppingCart测试,ShoppingCart传入Discount来计算折扣。
Discount.java基类
package com.figo.study2024.pattern.strategy;
/**
* 计算折扣接口
*/
public interface Discount {
public int calculate(int money);
}
package com.figo.study2024.pattern.strategy;
/**
* 满减
*/
public class FullDiscount implements Discount {
@Override
public int calculate(int money) {
if (money > 200){
System.out.println("优惠减免20元");
return money - 20;
}
return money;
}
}
package com.figo.study2024.pattern.strategy;
/**
* 首次购
*/
public class NewerDiscount implements Discount {
@Override
public int calculate(int money) {
if (money > 100){
return money - 20;
}
return money;
}
}
package com.figo.study2024.pattern.strategy;
/**
* 测试策略模式
* 购物车费用结算过程
*/
public abstract class ShoppingCart {
private Discount discount;
public void setDiscount(Discount discount) {
this.discount = discount;
}
//提交订单主流程
public void submitOrder(){
//计算商品金额
int money = balance();
System.out.println("商品总金额为:"+money+"元");
//优惠减免
money = discount.calculate(money);
System.out.println("优惠减免后:"+ money+"元,");
//保存及支付订单
pay(money);
//送货上门
sendHome();
}
//计算金额
private int balance(){
int money = 280;
//TODO 累加商品金额
return money;
}
private void sendHome(){
System.out.println("满39,免费送货上门");
}
//提交支付
protected abstract void pay(int money);
}
策略模式测试:
package com.figo.study2024.pattern.strategy;
import com.figo.study2024.pattern.template.MilkTea;
import com.figo.study2024.pattern.template.PearlMilkTea;
import com.figo.study2024.pattern.template.RedBeanMilkTea;
/**
* @ClassName:PatterTest
* @PackageName:com.figo.study2024.pattern.template
* @Description:客户端调用类描述
* @Date:2024/2/20 12:53
* @Author:figo
*/
public class PatterTest {
public static void main(String[] args) {
/**
* 购物车这里可以使用模板方法设计模式,继承ShoppingCart
* ,重写pay方法即可,这里演示策略模式就不另外写了
*/
ShoppingCart cart=new ShoppingCart() {
@Override
protected void pay(int money) {
System.out.println("使用云闪付支付");
}
};
//新用户,可以查询用户是否有购买记录,没有的话使用新用户折扣策略
cart.setDiscount(new NewerDiscount());
//满减,有购买记录,检查是否符合满减策略
// cart.setDiscount(new FullDiscount());
cart.submitOrder();
}
}