策略模式

策略模式

一 意图

在平时的软件开中,我们对一个功能可能有多种不同的实现方式。程序需要在这些不同的实现方式之间进行切换。而实现方式的切换,程序中往往需要大量判断逻辑的代码。当每增加一种新的实现方式后,程序的复杂度也会随之增加。

对于这种情况,策略模式就是一种好的解决方案。使用策略模式,可以把这些实现方式转移到相应的具体策略类里面,这样就可以消除程序大量的判断逻辑的代码,也可以很好的提高程序的扩展性。

其实以上的每一种实现方式,对应了策略模式中的一种算法。策略模式分开了算法的定义和使用。

二 定义

策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。

三 类图

class.png

Strategy******(抽象******策略类******):抽象策略类可以是接口,也可以是抽象类。它声明了某种算法,在具体策略类中会现实了抽象策略类声明的算法。

ConcreteStrategy******(具体策略类):具体策略类是抽象策略类的子类,它实现了抽象策略类声明的算法。

*** Context******(环境类)******:***在环境类中,声明了一个抽象策略类,用于定义所采用的策略。在环境类中我们使用具体的策略类。

四 代码示例

以交通工具为例,假如我们要从A地去往B地。我们可以选择诸如“公共汽车”,“火车”,“飞机”等多种交通工具。

这三种交通工具就相当于三个具体的策略类。他们都有交通的属性,可以把人和物品从一个地方转移到另一个地方,只是实现方式不同而已。不同的方式就相当于不同的算法。

Vehicle.png

我们定义了一个交通工具的抽象的策略接口。申明了一个run方法。

bus.png
train.png
plane.png

我们定义了三个具体的交通工具类(具体策略类),实现了抽象策略接口的run方法。三种交通工具提供了三种不同的run方法的实现,这三种不同的run方法的就是一系列算法。

context.png

在环境类中,我们定义了抽象工具类的接口。通过属性设置,我们可以替换不同的交通工具。在环境类中run方法中,封装了设置交通工具的run方法。

test.png

运行结果

result.png

五 总结

策略模式是一种对象行为型模式。它分离了算法的定义和使用。在服务端我们可以定义一系列的算法,这些算法有一个共同基类。客户端只需要知道使用哪一个算法。使用策略模式,我们可以很方便的切换算法和增加新的算法。

优点:

  1. 策略模式可以在不修改代码的情况下,可以任意切换算法。增加新的算法也很方便。符合了“开闭原则”。

  2. 策略模式所有的算法都继承自一个基类,便于对具体算法进行统一管理。继承可以在基类中抽象出所有算法的公共方法。

  3. 客户端可以不需要知道算法的复杂度。只需要知道使用哪个算法。

缺点:

  1. 策略模式中客户端需要知道所有的算法,才能知道具体使用哪一个算法。

  2. 策略模式可能会使系统中产生多个具体的算法类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容