策略模式
定义
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化。
结构
Context(环境类):环境类是使用算法的角色,它在使用解决的某个问题(即实现某个功能)时可以采用多种策略。
Strategy(抽象策略类):抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类。
ConcreteStrategy(具体策略类):具体策略类实现了在抽象策略类中声明的算法,在运行时具体策略类将覆盖在环境类中定义的抽象策略类对象。
类图
实现过程
先创建一个抽象类(抽象策略类),定义一些方法,然后创建一些类(具体策略类)去继承,并具体实现它的业务方法。然后再创建一个类(环境类)去调用抽象类,这里是直接把他当做成员变量传入环境类,它们之间的关系是聚合。
优点
- 策略模式提供了对开闭原则的完美支持。
- 策略模式提供管理相关算法中的办法。策略类的等级结构定义的一个算法或行为族,恰当地使用基层可以把公共代码转移到抽象策略类中,从而避免重复的代码。
- 策略模式提供了一种可以替换继承关系的办法。
- 使用策略模式可以避免多重条件选择语句。
- 策略模式提供了一种算法的复用机制,由于将算法单独提取出来封装在策略类中,因此不同的环境内可以方便的复用这些策略类。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成系统产生很多的具体策略类,任何细小的变化都将导致系统要增加一个新的具体策略类。
- 无法同时在客户端使用多个策略类。
适用环境
- 一个系统需要动态地在几种算法中选择一种。
- 一个对象有很多行为,如果不用恰当的模式,这些行为则只好使用多种条件选择语句来实现。
- 不希望客户端知道复杂的、与算法相关的数据结构。
一些理解
创建一个抽象类(面对抽象编程),然后创建一些类去继承它,然后具体实现。创建一个环境类,定义一些公有的方法和参数(也可以把Client客户类当做环境类,这里是进一步封装,也避免客户端知道关于具体实现的一些东西,遵循了接口隔离原则)。把抽象类当做成员变量传入环境类。关系是聚合。