策略模式真的只是为了干掉if-else吗?

tech2025-09-16  53

前言

提起策略模式,网上的很多文章都说是为了除去代码中繁杂的if-else,而实际上,这并不是策略模式的本质,单纯为了除去if-else我们可以用map来将判断条件与处理函数做个映射就好了,根本没必要大费周章的设计策略模式的三大部分:策略接口,策略实现类,策略上下文。

策略模式的本质是为了减少代码的耦合。我们常常说程序设计要符合开闭原则,我们可以增加和拓展,但是要避免修改,因为修改的代价往往是非常大的,在大型的项目中,我们修改了某一个小部分,都极有可能牵一发而动全身,造成整个team的代码迭代。

而通过引入策略模式,当我们在一些需要频繁切换策略的代码中,可以保持主逻辑不变,仅改动相关的小部分代码。

场景:计费策略

现在我们在开发一个收银系统,针对不同的客户,我们会采用不同的计费策略,普通用户、VIP用户的计费逻辑是不同的。针对这个场景,我们的代码是这样的:

//我们有一个策略上下文,我们从上下文中获取策略 class BillStrategyContext { private final static HashMap<String, BillStrategy> strategyMap; static { strategyMap = new HashMap<>(); strategyMap.put("NORMAL", new NormalBillStrategy()); strategyMap.put("VIP", new VIPBillStrategy()); } public static BillStrategy getBillStrategy(String type) { return strategyMap.get(type); } } //策略接口,每个具体的策略都会实现一个针对该场景的不同类型的方法 interface BillStrategy { void execute(); } //具体的两个实现类,对于普通用户和VIP用户,我们采用不同的计费策略 class NormalBillStrategy implements BillStrategy { public void execute() { System.out.println("normal consumer!"); } } class VIPBillStrategy implements BillStrategy { public void execute() { System.out.println("VIP consumer!"); } }

让我们看一下我们具体调用策略时需要做什么:

public static void getBill(Order order) { BillStrategy strategy = BillStrategyContext.getBillStrategy(order.getConsumerType()); strategy.execute(); }

仅需两行代码即可搞定!

这时如果我们有了新的顾客类型,增加了一个核心用户,我们只需为该用户新添加一个实现类

class CoreBillStrategy implements BillStrategy { public void execute() { System.out.println("core consumer!"); } }

并且在Context中添加新的用户类型:

strategyMap.put("CORE", new CoreBillStrategy());

无需改动业务处理主逻辑!是不是很”低耦合“?

对比我们的 if else实现方式:

if(order.ConsumerType.equals("VIP") { //... } else if(order.ConsumerType.equals("NORMAL") { //... } else if(order.ConsumerType.equals("CORE") { //... }

可以说是非常优雅了。尤其是在我们的策略类型很多很复杂,同时策略的实现又有着相互交织的关系时,策略模式的强大之处更能体现出来。

最新回复(0)