带你读《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

相关文章
|
6月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1371 35
|
7月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
11月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
185 4
|
11月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
230 14
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
495 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
175 1
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
246 2
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
139 2

热门文章

最新文章