设计模式精讲——策略模式

简介: 设计模式精讲——策略模式

设计模式精讲——策略模式

一、何为策略模式?

根据《设计模式之美》,策略模式(Strategy Pattern)是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通俗一点,就是你去买菜,可以选择骑共享单车去菜市场,也可以坐公交车,也可以滴滴打车,当然也可以选择不行,骑共享单车、坐公交车、滴滴打车、步行这都是不同的策略,但是你们的出发点和目的地都是一样的,因此这些策略是可以互换的,不影响你去买菜。

二、何时使用策略模式?

当使用超过3层的if-else或者长串的switch条件判断,我们就要考虑使用策略模式了,当然不只是这一种方法,工厂模式、状态模式也可以。

这是为什么呢?

因为使用超过3层的if-else或者长串的switch条件判断违反了:

  • 单一职责原则:即一个类只需要完成一个职责,比如我们常见的淋浴器材的旋钮,往一边是变热,一边是变冷,往往我们不能很好的控制水温,经常一会儿凉,一会儿烫。这是一个物理问题,由此产生了一个被称为淋浴方程的东西.

这是因为热水需要一定时间才能到你身上。还有一个重要的原因是旋钮的刻度不是均匀的。所以我们使用起来不方便。

但是如果我们采取单一职责原则,热水一个旋钮,冷水一个旋钮,就能容易控制了。

  • 开闭原则:对扩展开放,对修改关闭。

如果使用超过3层的if-else或者长串的switch条件判断且之中的代码量比较大时,后续代码的扩展和修改就会变得异常困难。

三、策略模式实例

下面就来用策略模式,实现我们去菜市场买菜的情形吧~

接口:

 

/**

* 去菜市场策略的接口(Strategy)

*/

interfacegoToMarketStrategy {

   voidaction();

}

 

具体方式,比如骑共享单车。

 

/**

* 骑共享单车(ConcreteStrategy)

*/

publicclasssharedBikeimplementsgoToMarketStrategy {

   

   @Override

   publicvoidaction() {

       System.out.println("骑上我心爱的小单车...");

   }

}

具体方式,坐公交车。

 

/**

* 坐公交车(ConcreteStrategy)

*/

publicclassBusimplementsgoToMarketStrategy {

   

   @Override

   publicvoidaction() {

       System.out.println("滴!学生卡...");

   }

}

滴滴太贵了,咋就不坐了~

具体方式,步行。

 

/**

* 步行(ConcreteStrategy)

*/

publicclasswalkingimplementsgoToMarketStrategy {

   

   @Override

   publicvoidaction() {

       System.out.println("我爱走路,身体棒棒...");

   }

}

环境类 谁决策,我决策。

 

/**

* 小伞(Context)

*/

publicclass小伞 {

 

   privategoToMarketStrategystrategy ;

 

   public小伞(goToMarketStrategystrategy) {

       this.strategy=strategy;

   }

 

   // 居家好男人要去买菜了。

   // 具体执行哪个,看我选哪个。

   publicvoidexec() {

       strategy.action();

   }

}

 

你是上帝,你来。。。

publicclassMain {

 

   publicstaticvoidmain(String[] args) {

 

       //第一个叫小伞的boy走路去买菜。

       小伞boy1=new小伞(newwalking());

       boy.exec();

       //第二个叫小伞的boy骑共享单车去买菜。

       小伞boy2=new小伞(newsharedBike());

       boy.exec();

       

       // ......

   }

}

四、优缺点

优点:

  • 很好的支持开闭原则,我们可以在不修改原本系统的基础上选择算法或行为,也可以方便地增加新的算法或行为
  • 能够避免多重条件选择语句
  • 不一样的环境类都能对策略类进行复用

缺点:

  • 客户端必须得清楚全部策略类,并做出决定采用哪一个策略类
  • 会导致系统生成许多具体策略类
  • 不能同时在客户端中使用多个策略类
目录
相关文章
|
4月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
4月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
99 14
|
10月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
123 4
|
7月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
218 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
9月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
97 1
|
10月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
124 2
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
94 2
|
11月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
103 3
|
11月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
110 3