策略模式定义:
它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式(Strategy)组成:
1. 定义一个所有支持的算法的公共接口策略接口或者抽象类,在这个接口或抽象类中定义一个算法方法由具体的策略实体类来重写,并实现具体的算法功能
package 大话设计模式.策略模式;
public interface Strategy {
public abstract void AlgorithmInterface();
}
2.定义具体的策略类,封装了具体的算法或者行为,实现Strategy接口
public class ConcreteStrategyA implements Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法A的实现");
}
}
package 大话设计模式.策略模式;
public class ConcreteStrategyB implements Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法B的实现");
}
}
package 大话设计模式.策略模式;
public class ConcreteStrategyC implements Strategy{
@Override
public void AlgorithmInterface() {
System.out.println("算法C的实现");
}
}
3.定义Context上下文类,用一个ContextStrategy来配置,维护一个对Strategy对象的引用
package 大话设计模式.策略模式;
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy=strategy;
}
public void contextInterface(){
this.strategy.AlgorithmInterface();
}
}
策略模式的优越性在哪里?
策略模式的核心思想在于针对同一个问题,出现不同种算法情况下的解决办法(比如实际问题中的商场打折促销,商家有多种打折手段,并且手段更换频繁),对于这种情况,策略模式封装了它变的部分,即就是把变的算法部分单独拿出来做了一个封装,这样坐的好处有:
1.扩展性:如果有新的算法方案,只需要创建一个新的策略类,再实现策略接口,实现具体的算法功能,在实例化Context类的时候,传入新的策略类的对象即可。足见其扩展性良好
2.可维护性,如果有一个算法设计不合理,比如打折手段不合适,那么我只需要修改该算法具体的策略类即可,其他地方一律不用改,维护成本低
3.灵活性,由于做了封装,有哪里需要用到该算法家族,直接创建上下文类Context对象,传入具体的策略类的实现,调用方法即可,代码量少,可复用价值高。