策略模式:设计模式系列(九)
in Archived / Pattern
策略模式(Strategy Pattern):是将一系列的算法封装起来,调用者根据需要可以只通过一个对象调用这些算法方法的设计模式,归类为行为型模式。
这一模式的解读分为以下几个方面:
- 算法方法有很多,且都可以把本质抽象出来。
- 算法方法被封装后,可以统一被一个对象调用。
- 调用算法方法的对象在调用前要知道可以调用什么。
使用策略模式的思考过程如下:
- 有一系列的算法希望被一个对象调用。
- 所以把这些算法都封装成一个个实现类。
- 这些算法实现类对象就成了调用他们的对象的参数。
明确一下结构,策略模式结构包含调用策略的实现类、策略实现类、策略实现类抽象出来的接口或协议。
状态模式示例代码如下(Swift语言):
class ObjectContext{
private var strategy:StrategyBluePrint?;
func setStrategy(objectState:StrategyBluePrint){
self.strategy = objectState;
}
func algorithm(){
self.strategy!.handler(self);
}
}
protocol StrategyBluePrint{
func handler(context:ObjectContext);
}
class Strategy1: StrategyBluePrint{
func handler(context:ObjectContext){
print("Strategy 1");
}
}
class Strategy2: StrategyBluePrint{
func handler(context:ObjectContext){
print("Strategy 2");
}
}
class Strategy3: StrategyBluePrint{
func handler(context:ObjectContext){
print("Strategy 3");
}
}
var context = ObjectContext();
context.setStrategy(Strategy1());
context.algorithm();
context.setStrategy(Strategy2());
context.algorithm();
context.setStrategy(Strategy3());
context.algorithm();
代码分析:ObjectContext
实例化对象context
是一个可以调用一系列策略的对象,实例化后,需要调用策略,需要知道策略是什么,所以需要有一个setStrategy
的过程,在调用algorithm
方法执行。以上代码输出结果如下:
Strategy 1
Strategy 2
Strategy 3
总结:策略模式是一个跟状态模式很相似的设计模式,区别之处在于策略模式调用的策略是需要调用者知道然后调用的,而状态模式的状态却是非透明自动转换的,因为他们的结构相似,所以具有一样的良好扩展性,解放了控制流语句,而因为策略模式跟状态模式的差别,策略模式需要知道具体策略是什么,在设置里才能调用,但是相比起状态模式,要低耦合。