一、说明
定义了一系列的算法,并把每个算法封装起来,使他们可以相互替换。这种模式使算法可独立于使用它的客户而变化。它的中心不是如何实现算法,而是如何组织、调用这些算法,让程序结构更灵活,具有更好的维护性和扩展性。
二、类图:
三、代码实现:
/**
* 策略,定义算法接口*/
public interface Strategy{
//某个算法接口,可以传入参数,可以有返回值
public void algorithmInterface();
}
public class ConcreteStrategyA implements Strategy{
public void algorithmInterface(){
//具体实现
}
}
public class ConcreteStrategyB implements Strategy{
public void algorithmInterface(){
//具体实现
}
}
public class ConcreteStrategyCS implements Strategy{
public void algorithmInterface(){
//具体实现
}
}
/**
* 上下文,持有一个具体的策略对象*/
public class Context{
//具体的策略对象
private Strategy strategy;
//构造函数,传入具体的策略对象
public Context(Strategy strategy){
this.strategy=strategy;
}
public void contextInterface(){
strategy.algorithmInterface();
}
}
四、策略模式逻辑
1.客户端选择并创建具体的策略对象。
2.客户端创建上下文
3.客户端使用上下文的方法来执行功能,在调用的时候,从客户端传入算法需要的参数。
4.上下文接到客户的调用请求,会把这个请求转发给它持有的Strategy.
五、扩展
1.通过以上逻辑,可以看出,上下文是具体策略的实现对象。策略实现对象也可以从上下文获取所需要的数据,这样上下文和策略的实现对象之间的耦合度就会很高。在这种情况下需要注意的是上下文数据的浪费,因为所有的策略对象实现都用同一个策略接口,传入相同的上下文。
2.
2.
策略实现扩展的方式有两种,即:扩展上下文,扩展封装实际的算法。