策略模式的目的是定义一系列算法,把它们封装起来,并且使它们可以相互替换.
本模式使得算法可以独立于它的客户而变话.
以下是关于策略模式的一个小例子:
package pattern.strategy;
/*
* 通常持有一个Strategy对象请求,也可以持有一个Strategy对象引用的聚集.
* 定义一系列客户接口的方法,将客户请求委托给Strategy的算法实现
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextRequest() {
// 委托具体策略的算法实现
strategy.doAlgorithm();
}
public void contextCallBackRequest() {
// Context 可以将自身作为一个参数传递给Strategy方法
strategy.doAlgorithm(this);
}
}
package pattern.strategy;
/*
*定义算法持有的公共接口.
*Context使用这个接口来调用某ConcreteStrategy定义的算法
*/
public interface Strategy {
void doAlgorithm();
// Context 可以将自身作为一个参数传递给Strategy方法
void doAlgorithm(Context context);
}
package pattern.strategy;
/*
* 实现Strategy接口的具体算法
*/
public class ConcreteStrategy implements Strategy {
public void doAlgorithm() {
System.out.println("doAlgorithm()");
}
public void doAlgorithm(Context context) {
System.out.println("callback doAlgorithm");
}
}
package pattern.strategy;
public class StrategyTest {
/**
* @param args
*/
public static void main(String[] args) {
Strategy strategy = new ConcreteStrategy();
Context context = new Context(strategy);
context.contextRequest();
}
}
我们看一下代码所示Strategy的协作方式 ,Context将客户请求转发给Strategy.
客户通常创建并传递一个ConcreteStrategy 对象给Context.这样,客户仅与Context
打交道,而Strategy和Context 相互作用,以实现选定的算法.当算法被调用时,Context可以将该算法需要的数据都传递给Strategy.或者,Context 也可以将自身作为一个参数传递给Strategy.这样,Strategy在需要时可以回调Context
策略模式 刚刚学习 大家简单了解一下
最新推荐文章于 2024-07-29 12:15:15 发布