设计模式 - 浅谈策略模式
策略模式
模式功能说明:它使你能在运行时改变对象的行为。
模式思路与原理
策略模式中,我们创建对象,它们表示各种策略,并且一个上下文对象,它的行为根据其策略对象的行为而变化。策略对象改变上下文对象的执行算法。
代码示例
interface Strategy {
public int doOperation(int num1, int num2);
}
class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
class OperationSubstract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubstract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
}
}
我们定义了一个策略接口Strategy
和两个实现了该接口的具体策略类OperationAdd
和OperationSubstract
。然后我们定义了一个上下文类Context
,它使用了策略接口,根据具体的策略对象来调用其算法的方法。在main
方法中,我们创建了Context
对象,并分别设置了不同的策略对象,然后调用executeStrategy
方法,可以看到不同的策略对象会导致Context
的行为发生改变。
使用场景:
- 一个系统有许多许多类,而区分它们的只是他们直接的行为策略。
- 一个系统需要动态地在几种算法中选择一种。
优缺点
优点:
- 可以清晰地定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。
- 算法可以自由切换。
- 避免使用多重条件判断。
- 提高算法的保密性和安全性。
缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 会产生很多策略类。
总结
策略模式使用了设计原则有:组合/聚合复用
(优先使用组合或聚合关系来实现对象之间的复用)和单一职责原则
(一个类只做一件事情)等。 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换,使算法可以独立于使用它的客户而变化。这使得程序的扩展性和维护性都得到了提高。