设计模式-行为型模式:策略模式

简介: 设计模式-行为型模式:策略模式

1、简介

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,使它们可以相互替换,而且算法的变化不会影响到使用算法的客户端。在这种模式中,一个类的行为或其算法可以在运行时改变,根据所传递的参数来确定应该使用哪个算法。

2、组成部分

策略模式主要由三个角色组成:上下文(Context)、策略(Strategy)和具体策略(Concrete Strategy)。下面分别介绍这三个角色:

  1. 上下文(Context):上下文是一个包含某个算法的类。它将一个具体策略对象传递给客户端,并在客户端使用这个对象时,调用该对象所定义的算法。上下文还可以在运行时更改所使用的算法。
  2. 策略(Strategy):策略是一个接口或抽象类,它定义了一系列算法。在实现策略时,可以定义多个具体的策略类,每个类都实现了策略接口,且实现了自己的算法。
  3. 具体策略(Concrete Strategy):具体策略是实现策略接口的类。它实现了一个特定的算法,供上下文调用。

策略模式的工作流程如下:

  1. 客户端通过上下文对象调用某个算法。
  2. 上下文对象将请求委托给一个具体策略对象。
  3. 具体策略对象执行其算法。
  4. 客户端通过上下文对象获得算法的结果。

3、优缺点

优点:

  1. 易于扩展:策略模式使得算法可以独立地进行修改和扩展,而不会影响到其它部分的代码。新的算法可以被轻松地添加进来,而不需要对原来的代码进行修改。
  2. 更好的可读性:使用策略模式可以使得代码的逻辑更加清晰,易于理解。不同的算法可以被分解为独立的类,从而使得代码结构更加简洁。
  3. 更好的可维护性:策略模式使得代码易于维护和修改,因为算法的实现被分离出来并封装在独立的类中。这使得对算法的修改和调试变得更加容易。
  4. 更好的复用性:策略模式可以使得算法的实现可以被重复利用。不同的算法可以被应用到不同的场景中,从而提高代码的复用性。

缺点:

  1. 增加了代码的复杂性:使用策略模式会增加代码的复杂性,因为它需要定义多个独立的类来实现不同的算法。
  2. 增加了对象数量:使用策略模式会增加对象的数量,因为每个算法都需要一个独立的对象来实现。这可能会影响到代码的性能。
  3. 客户端必须了解不同的策略:使用策略模式需要客户端了解不同的策略,从而选择合适的算法。这可能会增加客户端代码的复杂性。

总的来说,策略模式可以提高代码的灵活性和可维护性,但也会增加代码的复杂性和对象数量。在使用策略模式时,需要权衡这些优缺点,选择适合自己的方案。

4、使用场景

策略模式是一种非常常见的设计模式,可以在很多场景下使用。以下是一些使用策略模式的场景:

  1. 处理不同的输入:当需要处理不同类型的输入,例如不同格式的文件,不同类型的用户输入等时,可以使用策略模式来封装不同的处理逻辑。
  2. 处理不同的输出:当需要生成不同类型的输出,例如不同格式的文件,不同类型的用户输出等时,可以使用策略模式来封装不同的输出逻辑。
  3. 处理不同的业务规则:当需要在不同的业务场景下使用不同的业务规则,例如价格计算、商品优惠等时,可以使用策略模式来封装不同的业务规则。
  4. 优化代码重构:当需要重构代码以提高可维护性和可扩展性时,可以使用策略模式来将复杂的代码拆分成独立的策略对象,从而更容易进行代码维护和扩展。
  5. 处理复杂的状态转换:当需要处理复杂的状态转换逻辑时,可以使用策略模式来封装不同的状态转换策略,从而简化代码逻辑。
  6. 处理多语言支持:当需要支持多种语言时,可以使用策略模式来封装不同的语言翻译策略,从而使得程序可以更容易地支持多种语言。

总的来说,策略模式可以用于任何需要将算法封装为独立对象的场景。它可以提高代码的灵活性和可维护性,使得程序更易于扩展和维护。

5、代码实现

下面是一个使用Java实现策略模式的示例代码,并对其进行详细说明。

示例场景:假设有一个商场,商场里有不同类型的商品,每个商品的价格计算规则都不同。需要设计一个程序来计算每个商品的价格,同时可以灵活地切换不同的计算规则。

首先,我们需要定义一个策略接口,该接口中包含一个计算价格的方法:

1. public interface PriceCalculator {
2. double calculatePrice(double price);
3. }

然后,我们定义不同的计算规则,每个规则都实现PriceCalculator接口,并实现其calculatePrice方法:

1. public class DefaultPriceCalculator implements PriceCalculator {
2. @Override
3. public double calculatePrice(double price) {
4. return price;
5.     }
6. }
1. public class DiscountPriceCalculator implements PriceCalculator {
2. private double discount;
3. 
4. public DiscountPriceCalculator(double discount) {
5. this.discount = discount;
6.     }
7. 
8. @Override
9. public double calculatePrice(double price) {
10. return price * discount;
11.     }
12. }
1. public class VipPriceCalculator implements PriceCalculator {
2. private double discount;
3. 
4. public VipPriceCalculator(double discount) {
5. this.discount = discount;
6.     }
7. 
8. @Override
9. public double calculatePrice(double price) {
10. return price * discount;
11.     }
12. }

其中,DefaultPriceCalculator是默认的计算规则,即不打折;DiscountPriceCalculator是打折的计算规则,需要传入一个折扣参数;VipPriceCalculator是VIP会员价格的计算规则,同样需要传入一个折扣参数。

最后,我们定义一个商品类,包含商品的名称和价格,以及一个计算价格的方法,该方法使用策略模式来计算商品价格:

1. public class Product {
2. private String name;
3. private double price;
4. private PriceCalculator priceCalculator;
5. 
6. public Product(String name, double price, PriceCalculator priceCalculator) {
7. this.name = name;
8. this.price = price;
9. this.priceCalculator = priceCalculator;
10.     }
11. 
12. public double calculatePrice() {
13. return priceCalculator.calculatePrice(price);
14.     }
15. 
16. // getters and setters
17. }

其中,calculatePrice方法使用PriceCalculator接口来计算商品价格,可以动态地切换不同的计算规则。

现在,我们可以使用策略模式来计算商品价格。首先,我们创建不同类型的计算规则:

1. PriceCalculator defaultCalculator = new DefaultPriceCalculator();
2. PriceCalculator discountCalculator = new DiscountPriceCalculator(0.8);
3. PriceCalculator vipCalculator = new VipPriceCalculator(0.7);

然后,我们创建商品对象,并使用不同的计算规则来计算商品价格:

1. Product p1 = new Product("apple", 10, defaultCalculator);
2. Product p2 = new Product("banana", 20, discountCalculator);
3. Product p3 = new Product("orange", 30, vipCalculator);
4. 
5. System.out.println(p1.calculatePrice()); // 10.0
6. System.out.println(p2.calculatePrice()); // 16.0
7. System.out.println(p3.calculatePrice()); // 21.0

输出结果分别为10.0、16.0和21.0,说明使用策略模式可以动态地切换不同的计算规则,实现不同的价格计算方法。


相关文章
|
22天前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
218 35
|
6月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
273 16
|
6月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
226 16
|
6月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
208 8
|
2月前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
6月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
6月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
215 15
|
6月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
133 14
|
6月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
212 13
|
6月前
|
设计模式 Java 编译器
【设计模式】【行为型模式】解释器模式(Interpreter)
一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
139 11

热门文章

最新文章