策略模式+工厂模式+模板方法模式 处理复杂业务逻辑 代替大量if esle(源码详解)

需求场景:

我们化身汽车销售员卖汽车

  • 首先需要我们要有销售的流程
  • 打听客户需求 -> 协商价格 -> 根据客户等级给出价格 -> 客户很满意提车

在这里插入图片描述

需求分析:

我们的销售流程都是固定的流程 但是唯一不同的地方就是我要针对不同的用户给出不同的方案,简单案例就以价格变动为例

代码实现:

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));
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家级著名CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值