设计模式-策略模式(Strategy Pattern)

打印 上一主题 下一主题

主题 1806|帖子 1806|积分 5418

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设计模式-策略模式(Strategy Pattern)

一、概要

在软件设计中,策略模式(Strategy Pattern)是一种非常重要的活动型设计模式。它的焦点头脑是将算法或活动封装在差别的策略类中,使得它们可以互换,从而使得算法的选择和变更变得更加灵活和可扩展。
策略模式定义了一个算法眷属,分别封装起来,让它们可以互相更换。此模式让算法的变革独立于使用算法的客户。
主要角色


  • Context(上下文):持有一个策略对象的引用,用于调用具体的策略。
  • Strategy(策略接口):定义所有支持的算法的公共接口。
  • ConcreteStrategy(具体策略):实现了策略接口的具体类,每个类封装了差别的算法或活动。
策略模式的类图
  1.           +-------------+
  2.           |   Context  |
  3.           +-------------+
  4.           | - strategy |
  5.           +-------------+
  6.           | + setStrategy(Strategy) |
  7.           | + execute()  |
  8.           +-------------+
  9.                 ^
  10.                 |
  11.        +------------------+
  12.        |      Strategy    |
  13.        +------------------+
  14.        | + algorithm()    |
  15.        +------------------+
  16.           ^          ^
  17.           |          |
  18. +------------------+   +-------------------+
  19. | ConcreteStrategyA|   | ConcreteStrategyB |
  20. +------------------+   +-------------------+
  21. | + algorithm()    |   | + algorithm()     |
  22. +------------------+   +-------------------+
复制代码
二、策略模式的焦点头脑

策略模式的焦点头脑是将算法封装到一个个策略类中,并通过上下文对象动态决定使用哪个策略类,从而实现了算法的灵活切换和扩展。当需要改变某个具体活动时,只需修改策略类,而不必修改客户端代码。这样做能有效减少条件语句(如 if-else 或 switch-case),提高代码的可维护性和可扩展性。
三、策略模式的实现

下面我们通过一个现实的 Java 示例来深入理解策略模式。
3.1 定义策略接口

首先,定义一个 Strategy 接口,它包罗所有策略类的公共方法。
  1. public interface Strategy {
  2.     void executeAlgorithm();
  3. }
复制代码
3.2 实现具体策略类

接着,我们实现两个具体的策略类,它们分别代表差别的算法。
  1. public class ConcreteStrategyA implements Strategy {
  2.     @Override
  3.     public void executeAlgorithm() {
  4.         System.out.println("Executing strategy A.");
  5.     }
  6. }
  7. public class ConcreteStrategyB implements Strategy {
  8.     @Override
  9.     public void executeAlgorithm() {
  10.         System.out.println("Executing strategy B.");
  11.     }
  12. }
复制代码
3.3 定义上下文类

然后,我们定义一个 Context 类,它持有一个策略对象,并通过该策略对象调用算法。
  1. public class Context {
  2.     private Strategy strategy;
  3.     public Context(Strategy strategy) {
  4.         this.strategy = strategy;
  5.     }
  6.     // 设置不同的策略
  7.     public void setStrategy(Strategy strategy) {
  8.         this.strategy = strategy;
  9.     }
  10.     // 执行当前策略
  11.     public void execute() {
  12.         strategy.executeAlgorithm();
  13.     }
  14. }
复制代码
3.4 测试策略模式

现在我们通过测试代码来演示策略模式的使用:
  1. public class StrategyPatternDemo {
  2.     public static void main(String[] args) {
  3.         // 创建不同的策略
  4.         Strategy strategyA = new ConcreteStrategyA();
  5.         Strategy strategyB = new ConcreteStrategyB();
  6.         // 创建上下文,使用策略A
  7.         Context context = new Context(strategyA);
  8.         context.execute();  // 输出: Executing strategy A.
  9.         // 切换策略为B
  10.         context.setStrategy(strategyB);
  11.         context.execute();  // 输出: Executing strategy B.
  12.     }
  13. }
复制代码
3.5 策略模式的输出

  1. Executing strategy A.
  2. Executing strategy B.
复制代码
四、策略模式的优缺点

4.1 优点



  • 灵活的算法选择:通过上下文类可以动态选择差别的策略,而无需修改客户端代码。这样,我们能够在运行时决定具体使用哪种策略,增强了代码的灵活性。
  • 避免大量条件语句:策略模式避免了使用大量的 if-else 或 switch-case 语句来选择算法,使得代码更加清楚和简便。
  • 易于扩展:由于策略类都是独立的,如果要增加新算法,直接添加一个新的策略类即可,无需修改现有代码,符合开闭原则。
  • 高内聚低耦合:每个策略类都封装了独立的活动,与其他策略类没有直接关系,提高了系统的内聚性,同时也增强了系统的可维护性。
4.2 缺点



  • 增加类的数量:每种差别的算法或活动都需要一个具体策略类,这可能导致类的数量过多,尤其是在策略算法比较多时。
  • 客户端必须了解所有策略:在一些情况下,客户端需要知道所有可能的策略,才气正确地选择并使用合适的策略。这可能导致肯定的复杂度。
五、策略模式与其他设计模式的对比

5.1 策略模式 vs 状态模式

策略模式和状态模式都涉及到动态改变对象活动,但两者的应用场景有所差别。
特性策略模式状态模式用途主要用于封装差别的算法主要用于封装对象在差别状态下的活动对象的活动改变通过切换策略来改变对象活动通过切换状态来改变对象活动算法的切换客户端明确选择策略状态对象自行决定活动实现方式 上下文持有策略实例,外部决定使用哪种策略上下文持有状态实例,状态决定活动 5.2 策略模式 vs 工厂模式

策略模式和工厂模式经常一起使用,但它们的目的有所差别。
特性策略模式工厂模式目的封装差别的算法和活动创建对象,尤其是创建复杂对象关注点运行时根据差别策略决定活动提供一种创建对象的同一接口实现方式通过上下文对象在运行时选择策略通过工厂方法创建对象并返回实用场景动态活动切换,避免条件语句创建复杂对象,特殊是当对象创建过程复杂时 策略模式是活动型模式,强调算法和活动的封装与切换,而工厂模式则强调对象的创建过程。
六、策略模式的现实应用

策略模式在现实项目中有广泛的应用,以下是几个常见的场景:


  • 付出方式选择:在电商网站中,可以使用策略模式来选择差别的付出方式(如付出宝、微信付出、银行卡付出等)。
  • 排序算法选择:在数据处置惩罚系统中,用户可以根据数据的差别需求选择差别的排序算法,如快速排序、冒泡排序等。
  • 图形绘制:在图形界面程序中,差别的图形(如矩形、圆形)可能有差别的绘制方式,使用策略模式可以将绘制方式封装成差别的策略。
七、总结

策略模式是一种非常有用的设计模式,它使得系统的活动更加灵活,可以在运行时动态选择具体的算法或活动,从而避免了大量的条件语句。
如果在现实项目中遇到了需要在多个算法或活动之间切换的场景,策略模式是一个非常值得考虑的解决方案。它能有效提拔系统的可扩展性和可维护性。
在现实应用中,策略模式和其他设计模式(如状态模式、工厂模式等)往往可以结合使用,以满足更复杂的业务需求。
  以上是关于 设计模式-策略模式(Strategy Pattern)的部分看法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表