策略模式
一 意图
在平时的软件开中,我们对一个功能可能有多种不同的实现方式。程序需要在这些不同的实现方式之间进行切换。而实现方式的切换,程序中往往需要大量判断逻辑的代码。当每增加一种新的实现方式后,程序的复杂度也会随之增加。
对于这种情况,策略模式就是一种好的解决方案。使用策略模式,可以把这些实现方式转移到相应的具体策略类里面,这样就可以消除程序大量的判断逻辑的代码,也可以很好的提高程序的扩展性。
其实以上的每一种实现方式,对应了策略模式中的一种算法。它分开了算法的定义和使用。
二 定义
策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。策略模式是一种对象行为型模式。
三 类图
Strategy(抽象策略类):抽象策略类可以是接口,也可以是抽象类。它声明了某种算法,在具体策略类中会现实了抽象策略类声明的算法。
ConcreteStrategy(具体策略类):具体策略类是抽象策略类的子类,它实现了抽象策略类声明的算法。
Context(环境类):在环境类中,声明了一个抽象策略类,用于定义所采用的策略。在环境类中我们使用具体的策略类。
四 代码示例
以交通工具为例,假如我们要从A地去往B地。我们可以选择诸如“公共汽车”,“火车”,“飞机”等多种交通工具。
这三种交通工具就相当于三个具体的策略类。他们都有交通的属性,可以把人和物品从一个地方转移到另一个地方,只是具体方式不同而已。不同的方式就相当于不同的算法。
我们定义了一个交通工具的抽象的策略接口。申明了一个run方法。
我们定义了三个具体的交通工具类(具体策略类),实现了抽象策略接口的run方法。三种交通工具提供了三种不同的run方法的实现,这三种不同的run方法的就是一系列算法。
在环境类中,我们定义了抽象工具类的接口。通过属性设置,我们可以替换不同的交通工具。在环境类中run方法中,封装了设置交通工具的run方法。
运行结果
五 总结
策略模式分离了算法的定义和使用。在服务端我们可以定义一系列的算法,这些算法有一个共同基类。客户端只需要知道使用哪一个算法。使用策略模式,我们可以很方便的切换算法和增加新的算法。
优点:
- 策略模式可以在不修改代码的情况下,可以任意切换算法。增加新的算法也很方便。符合了“开闭原则”。
- 策略模式所有的算法都继承自一个基类,便于对具体算法进行统一管理。继承可以在基类中抽象出所有算法的公共方法。
- 客户端可以不需要知道算法的复杂度。只需要知道使用哪个算法。
缺点:
- 策略模式中客户端需要知道所有的算法,才能知道具体使用哪一个算法。
- 策略模式可能会使系统中产生多个具体的算法类。