1.策略模式的定义及使用场景
定义:
在软件的开发中常常遇到一个情况,实现某一个功能可以有多种算法或则策略,我们根据实际情况选择不同的算法或则策略来完成该功能。针对这种情况,一种常规的方法是将多种算法写在一个类中,通过if-else等条件判断语句来选择具体的算法,但明显违背了开闭原则和单一责任原则。如果将这些算法或则策略抽象出来,提供一个统一的接口,不同的算法或则策略有不同的实现,这样在程序客户端就可以通过注入不同的实现对象来实现算法或则策略的动态替换,这种模式的扩展性、可维护性更高。策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化
使用场景:
针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
需要安全地封装多种同一类型的操作时
出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时
2. 策略模式的优缺点
2.1优点
算法可以自由切换
避免使用多重条件判断
扩展性良好
2.2缺点
策略类数量增多
所有的策略类都需要多外暴露
3.注意实现
如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露问题,否则将增大日后的维护成本
4. 策略模式的实现方式
public interface Strategy {
public void doSomeThing();
}
public class ConcreteStrategy1 implements Strategy {
@Override
public void doSomeThing() {
System.out.println("具体算法1的运算法则...");
}
}```
public class ConcreteStrategy2 implements Strategy {
@Override
public void doSomeThing() {
System.out.println("具体算法2的运算法则...");
}
}```
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void doSomeThing() {
strategy.doSomeThing();
}
}```
ublic class Test {
public static void main(String args[]) {
Strategy concreteStrategy1 = new ConcreteStrategy1();
Strategy concretStrategy2 = new ConcreteStrategy2();
Context context = new Context(concreteStrategy1);
context.doSomeThing();
context.setStrategy(concretStrategy2);
context.doSomeThing();
}
}```
出处:http://huangjunbin.com/page/2/
网友评论