每日一文
欲闻其声反默,欲张反敛,欲高反下,欲取反与。欲开情者,象而比之,以牧其辞,同声相呼,实理同归。或因此,或因彼,或以事上,或以牧下,此听真伪、知同异,得其情诈也。动作言默,与此出入,喜怒由此以见其式,皆以先定为之法则。
策略模式
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。在我理解
如果我们想往一个方法当中插入随便一段代码的话,就是策略模式。即如下形式:
public class MyClass {
public void myMethod(StrategyInterface strategyInterface){
System.out.println("方法里的代码");
//你看我是不是插进来一段代码?而且这段代码是可以随便改变的
strategyInterface.insertCode();
System.out.println("方法里的代码");
}
}
我们可以使用不同的策略接口实现类,实现统一方法下的不同策略动态加载!
示例图
实例
1. 策略接口及实现:
package net;
public interface Strategy {
void algorithm();
}
class ConcreteStrategyA implements Strategy{
public void algorithm() {
System.out.println("采用策略A计算");
}
}
class ConcreteStrategyB implements Strategy{
public void algorithm() {
System.out.println("采用策略B计算");
}
}
class ConcreteStrategyC implements Strategy{
public void algorithm() {
System.out.println("采用策略C计算");
}
}
2. 插入策略的类
package net;
public class Context {
Strategy strategy;
public void method(){
strategy.algorithm();
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
3. 客户端调用
package net;
public class Client {
public static void main(String[] args) throws Exception {
Context context = new Context();
context.setStrategy(new ConcreteStrategyA());
context.method();
context.setStrategy(new ConcreteStrategyB());
context.method();
context.setStrategy(new ConcreteStrategyC());
context.method();
}
}
总结:
策略模式的重心
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
公有的行为
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。