需求场景:
我们化身汽车销售员卖汽车
- 首先需要我们要有销售的流程
- 打听客户需求 -> 协商价格 -> 根据客户等级给出价格 -> 客户很满意提车
需求分析:
我们的销售流程都是固定的流程 但是唯一不同的地方就是我要针对不同的用户给出不同的方案,简单案例就以价格变动为例
代码实现:
1.创建流程策略接口
/**
* 创建销售策略接口
*/
public interface DiscountsStrategy {
// 销售流程方法
// 将流程中不确定因素-> 价格 作为参数传入
void sell(BigDecimal bigDecimal);
}
2.创建流程模板
/**
* 销售汽车流程模板
* 声明流程所以方法 用于子类灵活改变销售方法
*/
// 用该注解 让spring我们的类
@Component
public abstract class SellTemplate implements DiscountsStrategy, InitializingBean {
protected void requirement() {
System.out.println("打听客户需求!");
}
protected void money() {
System.out.println("协商价格");
}
// 拿出价格方案 (改变价格)
public abstract void discount(BigDecimal bigDecimal);
protected void take() {
System.out.println("客户提走汽车");
}
@Override
public void sell(BigDecimal bigDecimal) {
requirement();
money();
discount(bigDecimal);
take();
}
}
3.创建具体策略对象工厂
/**
* 策略工厂类 生产具体策略对象
*/
public class UserPayStrategyFactory {
private static Map<String,DiscountsStrategy> servicesMap = new HashMap<>();
// map的get
public static DiscountsStrategy getByUserType(String type) {
System.out.println(servicesMap);
return servicesMap.get(type);
}
// map的set
public static void register(String userType, DiscountsStrategy discountsStrategy) {
Assert.notNull(userType, "type can't be null");
servicesMap.put(userType, discountsStrategy);
}
}
4.创建具体策略类
/**
* 高级客户打折策略
*/
@Component
public class AdvancedStrategy extends SellTemplate{
private static final String type = "1";
// 0.7折
@Override
public void discount(BigDecimal bigDecimal) {
System.out.println("最终价格"+ bigDecimal.multiply(new BigDecimal("0.7")));;
}
@Override
public void afterPropertiesSet() throws Exception {
UserPayStrategyFactory.register(type, this);
}
}
/**
* 中级客户打折策略
*/
@Component
public class MediumStrategy extends SellTemplate{
private static final String type = "2";
// 0.8折
@Override
public void discount(BigDecimal bigDecimal) {
System.out.println("最终价格"+ bigDecimal.multiply(new BigDecimal("0.8")));;
}
@Override
public void afterPropertiesSet() throws Exception {
UserPayStrategyFactory.register(type, this);
}
}
/**
* 普通客户打折优惠策略
*/
@Component
public class GeneralStrategy extends SellTemplate {
private static final String type = "3";
// 打0.9折
@Override
public void discount(BigDecimal bigDecimal) {
System.out.println("最终价格"+ bigDecimal.multiply(new BigDecimal("0.9")));;
}
@Override
public void afterPropertiesSet() throws Exception {
UserPayStrategyFactory.register(type, this);
}
}
5.创建测试类
注意 InitializingBean接口的afterPropertiesSet方法是在项目初始化bean时调用的
@SpringBootTest
@RunWith(SpringRunner.class)
public class test {
@Test
public void a() {
String type = "1";
// 创建策略对象
DiscountsStrategy discountsStrategy = UserPayStrategyFactory.getByUserType(type);
discountsStrategy.sell(new BigDecimal(1000));
}
}