title: Strategy模式
tag: 笔记 设计模式
Strategy模式
无论什么程序,其目的都是解决问题。而为了解决问题,我们又需要编写特定的算法。使用Strategy
模式可以整体地替换算法的实现部分。能够整体地替换算法,能让我们轻松地以不同的算法去解决同一个问题,这种模式就是Strategy
模式。
介绍
**意图:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
**主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。
**如何解决:**将这些算法封装成一个一个的类,任意地替换。
**关键代码:**实现同一个接口。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
**注意事项:**如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
示例程序
该程序的作用是根据不同的策略执行不同的算术符。
Strategy
接口:定义了算术符策略的接口,在Context
类中使用。OpearationAdd
等实现类:具体的策略,包含具体的算法实现。Context类
:负责将客户端的请求委托给具体的策略对象执行。
Strategy接口
public interface OperationStrategy {
int doOperation(int a, int b);
}
具体的策略类
public class OperationAdd implements OperationStrategy{
@Override
public int doOperation(int a, int b) {
return a + b;
}
}
public class OperationMultiply implements OperationStrategy{
@Override
public int doOperation(int a, int b) {
return a * b;
}
}
public class OperationSubtract implements OperationStrategy{
@Override
public int doOperation(int a, int b) {
return a / b;
}
}
我们定义了三种不同的策略,分别是加法,乘法和除法。
Context类
public class Context {
OperationStrategy strategy;
public Context(OperationStrategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.doOperation(a, b);
}
}
该类初始化需要传入一个策略类,并在executeStrategy
方法中,调用策略类的具体算法。
测试
public static void main(String[] args) {
System.out.println(new Context(new OperationAdd()).executeStrategy(10, 5));
System.out.println(new Context(new OperationMultiply()).executeStrategy(10, 5));
System.out.println(new Context(new OperationSubtract()).executeStrategy(10, 5));
}
输出:
15
50
2
Strategy类中的角色
Strategy
(策略)
**Strategy
角色负责决定实现策略所必需的接口(API)。**在示例程序中,由Strategy
接口扮演此角色。
ConcreteStrategy
(具体的策略)
ConcreteStrategy
角色负责实现Strategy角色的接口(API),即负责实现具体的策略(战略、方向、方法和算法)。在示例程序中,由OpearationAdd
等实现类扮演此角色。
- Context(上下文)
负责使用Strategy
角色。Context
角色保存了ConcreteStrategy
角色的实例,并使用ConcreteStrategy
角色去实现需求。在示例程序中,由Context
类扮演此角色。
此角色。
- Context(上下文)
负责使用Strategy
角色。Context
角色保存了ConcreteStrategy
角色的实例,并使用ConcreteStrategy
角色去实现需求。在示例程序中,由Context
类扮演此角色。