Luckylau's Blog

设计模式之策略模式

​ 策略(Strategy)模式是对算法的一种封装,是把使用算法的责任和算法本身分割开来,委托给不同的对象管理,从而可以实现算法的互换,从而一个类的行为或其算法可以在运行时更改,这种设计模式属于行为型模式。

​ 策略模式在生活中和架构设计中非常常见。比如,商场打折,对于同样一类商品,不同的时间,促销方式和打折力度是不同的,这时候,促销方式和打折力度就是策略,对于这种应用场景来说,策略需要是可以随时变更的。还有个例子,比如排序,不同的对象,其排序依据不同。对于学生而言,有时候根据身高排序安排坐位,有时候根据成绩排序安排考场,这时候把这两种排序方式独立出来是一种比较好的方法,当需要安排坐位时,就使用“按照身高排序”的策略,当需要安排考场时就使用“按照成绩排序”的策略。从而一旦有新的需求和新的策略,只需要变更另外一个策略(比如“按年龄排序”)就OK了。

以加减乘除为例,不用策略模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Main {
public static void main(String[] args) {
String operator = "+";
int a = 10;
int b = 5;
int result = 0;
if ("+".equals(operator)) {
result = add(a,b);
} else if ("-".equals(operator)) {
result = sub(a,b);
} else if ("*".equals(operator)) {
result = mul(a,b);
} else {
result = div(a,b);
}
System.out.println("结果是:" + result);
}
static int add(int a, int b) {
return a + b;
}
static int sub(int a, int b) {
return a - b;
}
static int mul(int a, int b) {
return a * b;
}
static int div(int a, int b) {
if (b == 0) throw new RuntimeException("除数不能为0");
return a / b;
}
}

使用策略模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public interface Operation {
int calculate(int x, int y);
}
public class AddOperation implements Operation {
public int calculate(int x, int y) {
return x + y;
}
}
public class SubOperation implements Operation {
public int calculate(int x, int y) {
return x - y;
}
}
public class MulOperation implements Operation {
public int calculate(int x, int y) {
return x * y;
}
}
public class DivOperation implements Operation {
public int calculate(int x, int y) {
return x / y;
}
}
public class Calculator {
private Operation operation;
public Calculator(Operation operation) {
this.operation = operation;
}
public void setOperation(Operation operation) {
this.operation = operation;
}
public int calculate(int x, int y) {
return operation.calculate(x, y);
}
}
public class Client {
public static void main(String[] args) {
int x = 6, y = 3;
Calculator calculator = new Calculator(new AddOperation());
System.out.println("6+3=" + calculator.calculate(x, y));
calculator.setOperation(new SubOperation());
System.out.println("6-3=" + calculator.calculate(x, y));
calculator.setOperation(new MulOperation());
System.out.println("6*3=" + calculator.calculate(x, y));
calculator.setOperation(new DivOperation());
System.out.println("6/3=" + calculator.calculate(x, y));
}
}
Luckylau wechat
如果对您有价值,看官可以打赏的!