带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(1)
https://developer.aliyun.com/article/1262322?groupCode=taobaotech
基本概念
策略模式的核心思想是对算法进行封装,委派给不同对象来管理。这样,我们就可以定义一系列算法,将每个算法 封装到具有公共接口的一系列具体策略类中,从而使它们可以灵活替换,并让算法可以在不影响到客户端的情况下 发生变化。同时,策略模式仅仅封装算法(包括添加、删除),但其并不决定在何时使用何种算法,算法的选择由 客户端来决定。
比如,我们旅游时可以选择的出行策略有很多种:自行车、汽车、火车、飞机,每种出行策略都有各自的使用方 法,只要能到目的地,我们可以随意更换各种策略。再比如我们去逛商场,商场会有很多促销活动:满减、返利 等,这些促销方式本质上都是一些算法,而算法本身也是一种策略,随时都可能互相替换的,针对同一件商品,今 天满500减50、明天满300返100购物券,这些策略之间同样可以互换。
那么,我们应该如何使用策略模式呢?下面将从结构和使用步骤两个层面,对策略模式进行概念性介绍。
结构
策略模式包含三种类,分别是抽象策略类、具体策略类、环境类,它们各自负责完成特定任务,并且相互之间存在 紧密的联系。
使用
有了上述的基本概念,我们将策略模式的使用步骤概括为:
1. step1:创建抽象策略类,为具体策略定义好一个公共接口;
2. step2:创建具体策略类,其通过接口来实现抽象策略类,同时封装了具体的算法;
3. step3:创建环境类,持有一个抽象策略类的引用,提供给客户端调用。
使用示例
淘宝用户都知道,除了双11购物狂欢节,平台每年都会打造很多其他的促销活动。试想一下,如果每种大促活动都 使用一种促销模式,未免太过枯燥,于用户、商家、平台而言都不友好。因此,为了提升用户购买体验、突出商家 营销特点,需要面向不同大促活动使用不同的策略进行促销。这里以促销策略为例,简单分析策略模式如何使用:
代码实现
//step1:定义抽象策略角色(Strategy):所有促销活动的共同接口 public interface Strategy { void show(); } //step2:定义具体策略角色(Concrete Strategy):不同类型的具体促销策略 //618大促活动 A public class ConcreteStrategyA implements Strategy{ @Override public void show() { System.out.println("618大促"); } } //99大促活动 B public class ConcreteStrategyB implements Strategy{ @Override public void show() { System.out.println("99大促"); } } //双11大促活动 C public class ConcreteStrategyC implements Strategy{ @Override public void show() { System.out.println("双11大促"); } } //step3:定义环境角色(Context):把促销活动推送给用户,这里可理解为淘宝平台 public class Context_TaoPlatform{ //持有抽象策略的引用 private Strategy myStrategy; //生成构造方法,让平台根据传入的策略参数选择策略 public TaoPlatform(Strategy strategyType) { this.myStrategy = strategyType; } //向用户展示促销活动 public void taoPlatformShow(String time) { System.out.println(time + "的促销策略是:"); myStrategy.show(); } } //step4:客户端调用 public class StrategyPattern{ public static void main(String[] args){ Context_TaoPlatform context; String time1 = "9月"; Strategy strategyB = new ConcreteStrategyB(); context = new Context_TaoPlatform(strategyB); context.taoPlatformShow(time1); String time2 = "11月"; Strategy strategyC = new ConcreteStrategyC(); context = new Context_TaoPlatform(strategyC); context.taoPlatformShow(time2); String time3 = "6月"; Strategy strategyA = new ConcreteStrategyA(); context = new Context_TaoPlatform(strategyA); context.taoPlatformShow(time3); } }
结果输出
9月的促销策略是: 99大促 11月的促销策略是: 双11大促 6月的促销策略是: 618大促
UML图
带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(3)
https://developer.aliyun.com/article/1262319?groupCode=taobaotech