目录
  1. 1. 策略模式
    1. 1.1. 定义
    2. 1.2. 策略模式示意图
    3. 1.3. 流程
    4. 1.4. 代码实现
      1. 1.4.1. 策略
      2. 1.4.2. 封装
      3. 1.4.3. 场景实现
    5. 1.5. 应用场景
    6. 1.6. 策略模式的优缺点
      1. 1.6.1. 优点
      2. 1.6.2. 缺点
策略模式

策略模式

定义

Define a family of algorithms , encapsulate each one , and make them interchangeable.
定义一组算法,将每个算法封装起来,并且使它们之间可以互换。

策略模式示意图

策略模式

流程

  1. 定义一个总的策略接口,所有的具体策略都要实现这个接口,因为这些策略都有相同的目标。
  2. 将策略封装进策略上下文,让策略有完整的过程。
  3. 客户直接就使用这个完整的过程。

代码实现

策略

  1. 策略总接口
1
2
3
4
5
6
7
/**
* 策略总接口
*/
public interface IStrategy {
/* 对外提供的策略接口 */
public void strategy();
}
  1. 实现总接口的具体策略1
1
2
3
4
5
6
7
public class Strategy1 implements IStrategy {
/* 具体策略1,我们需要的第一个策略 */
@Override
public void strategy() {
System.out.println("策略1");
}
}
  1. 实现总接口的具体策略2
1
2
3
4
5
6
7
public class Strategy2 implements IStrategy{
/* 具体策略2,我们需要的第二个策略 */
@Override
public void strategy() {
System.out.println("策略2");
}
}
  1. 实现总接口的具体策略3
1
2
3
4
5
6
7
public class Strategy3 implements IStrategy {
/* 具体策略3,我们需要的第三个策略 */
@Override
public void strategy() {
System.out.println("策略3");
}
}

封装

将策略进行封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 策略上下文,封装策略,将需要的策略置于需要的场景中
*/
public class Context {
private IStrategy strategy ;

/* 获取封装的策略 */
public IStrategy getStrategy(){
return strategy ;
}

/* 将需要的策略放入策略上下文中 */
public void setStrategy(IStrategy strategy){
this.strategy = strategy ;
}

/* 执行策略,可以在策略周围添加我们需要的逻辑 */
public void executeStrategy(){
System.out.println("策略开始执行");
strategy.strategy();
System.out.println("策略执行完成");
}
}

场景实现

1
2
3
4
5
6
7
8
9
10
11
12
public class Test{
public static void main(String[] args) {
/* 先创建需要的具体策略 */
IStrategy strategy1 = new Strategy1();
/* 然后创建执行过程 */
Context context = new Context();
/* 将策略放入执行过程 */
context.setStrategy(strategy1);
/* 添加上我们的逻辑后,我们就可以开始执行策略了 */
context.executeStrategy();
}
}

应用场景

  1. 多个类只有在算法或行为上稍有不同的场景。
  2. 算法需要自由切换。
  3. 需要屏蔽算法规则。
  4. 如果具体策略数量大于3个,可以考虑使用混合模式。

策略模式的优缺点

优点

  1. 策略算法可以自由切换
  2. 避免使用多重条件判断,我们有这么多策略,不需要使用判断语句来判断需要使用哪种策略,我们这是被动选择策略。我们可以使用多态来,我们主动选择策略。
  3. 扩展性好,我们可以随时添加一个策略而不用改任何代码。

缺点

  1. 每个策略类就是一种策略,具体策略类不能被复用,这样策略变多,会显得很臃肿。
  2. 我们需要创建具体策略对象,这样所有的策略类都会向对外暴露,违反了迪米特法则。
文章作者: rack-leen
文章链接: http://yoursite.com/2019/05/19/Java/Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%A1%8C%E4%B8%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论