十三、设计模式之策略模式
在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式
策略模式:
- 定义了一组算法(业务规则);
- 封装了每个算法;
- 这族的算法可互换代替(interchangeable)
所属类型 | 定义 |
---|---|
行为型 | 定义一个算法族,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端而变化。 |
能帮我们干什么?
主要解决什么问题?
主要解决的是 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
**何时使用:**一个系统有许多许多类,而区分它们的只是他们直接的行为。
**如何解决:**将这些算法封装成一个一个的类,任意地替换。
优缺点
优点
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。
使用的场景
1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立
角色
策略模式包含以下几个核心角色:
- 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
- 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
- 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
实现
**关键代码:**实现同一个接口。
策略模式
难度: ⭐️
样例代码
java/com/kongxiang/raindrop/dp/type/behavior/strategy · master · 无难事者若执 / 23种设计模式 · GitCode
描述:
计算器 + /, 输入两个数。 算法±*/ 计算
public interface Strategy {
public int operate(int a , int b );
}
public class AddStrategy implements Strategy{
@Override
public int operate(int a, int b) {
return a + b;
}
}
public class MovStrategy implements Strategy{
@Override
public int operate(int a, int b) {
return a / b;
}
}
context 计算 ,输入不同算法,就可以执行获取不同结果
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int execute(int a, int b) {
return this.strategy.operate(a, b);
}
}
总结
通过使用策略模式,可以帮助我们在运行时根据需要选择不同的算法,而不需要修改客户端代码。
策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。