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

相关文章
|
2天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
9 2
|
16天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
42 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
32 3
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
28 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
62 3
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
27 3
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
30 1
|
1月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
|
1月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
19 0
|
1月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 在PHP开发领域,设计模式是提升代码可维护性、扩展性和重用性的关键技术之一。本文聚焦于策略模式这一行为型设计模式,通过理论阐述与实例分析,揭示其在PHP应用程序中优化算法切换和业务逻辑解耦方面的强大效用。不同于常规摘要,本文不直接概述研究方法或结果,而是基于实际开发场景,探讨策略模式的应用价值和实现方式,旨在为PHP开发者提供一种高效应对复杂业务需求变化和技术债务累积问题的策略思维。