设计模式之策略模式

什么是策略模式

定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

策略模式也叫政策模式,它很好的应用了面向对象思想,下面来感受一下。

举个栗子

策略模式的模型图

策略模式有三种角色:上下文、抽象策略、具体策略,下面来看实例编码

  • 抽象策略
1
2
3
public interface Strategy {
void method();
}
  • 具体策略
1
2
3
4
5
6
7
8
9
10
11
12
public class ConcreteStrategy1 implements Strategy {
@Override
public void method() {
System.out.println("策略1");
}
}
public class ConcreteStrategy2 implements Strategy {
@Override
public void method() {
System.out.println("策略2");
}
}
  • 上下文
1
2
3
4
5
6
7
8
9
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void contextMethod(){
strategy.method();
}
}
  • 调用场景
1
2
3
4
5
6
7
8
9
10
11
public class Client {
public static void main(String[] args) {
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
Context context;
context = new Context(strategy1);
context.contextMethod();
context = new Context(strategy2);
context.contextMethod();
}
}

输出结果

1
2
策略1
策略2

这就是策略模式,特别简单,你甚至会觉得这就是很普通的代码,然而就是这样,只要有面向对象的思想,就能看懂策略模式。

适用范围

策略模式适用于在算法策略上不同但是需要相互切换的场景,我们无需关注算法内部细节,而且他们之间可以随意切换使用,非常自由。

优点缺点

策略模式优点就是只要实现接口,就可以扩展,切换十分自由,并且通过一个上下文环境来避免了逻辑条件判断语句,简化了操作。

策略模式的缺点是类的数量会变多,而且所有的类都要对调用者暴露,违背迪米特法则,实际应用中需要结合其他设计模式来修正这些缺点。

策略枚举

策略模式还有一种很好的用法就是策略枚举,这里用一个非常典型的加减法计算器为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public enum Calculator {  
ADD("+") {
@Override
public int exec(int a, int b) {
return a+b;
}
},
SUB("-") {
@Override
public int exec(int a, int b) {
return a-b;
}
};
public abstract int exec(int a, int b);
//运算符
private String value = "";
private Calculator(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
  • 调用场景
1
2
3
4
public static void main(String[] args) {  
int add = Calculator.ADD.exec(10, 30);
int sub = Calculator.SUB.exec(10, 30);
}

非常简单,就是应用了一下枚举类,不过里面有着很明显的策略模式,这是一种很好的用法,用于处理不变的角色。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!