带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(2)

简介: 带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式

带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(1)

https://developer.aliyun.com/article/1262322?groupCode=taobaotech



基本概念


策略模式的核心思想是对算法进行封装,委派给不同对象来管理。这样,我们就可以定义一系列算法,将每个算法 封装到具有公共接口的一系列具体策略类中,从而使它们可以灵活替换,并让算法可以在不影响到客户端的情况下 发生变化。同时,策略模式仅仅封装算法(包括添加、删除),但其并不决定在何时使用何种算法,算法的选择由 客户端来决定。


image.png


比如,我们旅游时可以选择的出行策略有很多种:自行车、汽车、火车、飞机,每种出行策略都有各自的使用方 法,只要能到目的地,我们可以随意更换各种策略。再比如我们去逛商场,商场会有很多促销活动:满减、返利 等,这些促销方式本质上都是一些算法,而算法本身也是一种策略,随时都可能互相替换的,针对同一件商品,今 天满500减50、明天满300返100购物券,这些策略之间同样可以互换。


那么,我们应该如何使用策略模式呢?下面将从结构和使用步骤两个层面,对策略模式进行概念性介绍。


结构


策略模式包含三种类,分别是抽象策略类、具体策略类、环境类,它们各自负责完成特定任务,并且相互之间存在 紧密的联系。

image.png


image.png



使用

有了上述的基本概念,我们将策略模式的使用步骤概括为:

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图


image.png


带你读《2022技术人的百宝黑皮书》——浅析设计模式2 —— 策略模式(3)

https://developer.aliyun.com/article/1262319?groupCode=taobaotech

相关文章
|
1月前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
30天前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
24 1
|
1月前
|
设计模式 算法 Java
小谈设计模式(3)—策略模式
小谈设计模式(3)—策略模式
|
9天前
|
设计模式 算法 架构师
设计模式-策略模式详解
系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
333 0
|
1月前
|
设计模式 算法
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
20 1
|
1月前
|
设计模式 算法
大话设计模式(2)——策略模式
大话设计模式(2)——策略模式
22 1
|
1月前
|
设计模式 JavaScript 算法
js设计模式-策略模式与代理模式的应用
策略模式和代理模式是JavaScript常用设计模式。策略模式通过封装一系列算法,使它们可互换,让算法独立于客户端,提供灵活的选择。例如,定义不同计算策略并用Context类执行。代理模式则为对象提供代理以控制访问,常用于延迟加载或权限控制。如创建RealSubject和Proxy类,Proxy在调用RealSubject方法前可执行额外操作。这两种模式在复杂业务逻辑中发挥重要作用,根据需求选择合适模式解决问题。
|
1月前
|
设计模式
LabVIEW状态机设计模式技术手册和练习
LabVIEW状态机设计模式技术手册和练习
24 0
|
1月前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
31 1
|
1月前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式