0%

设计模式-策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

策略模式相对简单工厂耦合度更低, 只需要开放一个类给客户端

无论是简单工厂还是策略模式都没有消除switch, 若想消除可用反射, 参考抽象工厂模式

示例

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
interface IStrategy
{
int DoOprea(int a, int b);
}

public class OperaAdd : IStrategy
{
public int DoOpera(int a, int b)
{
return a + b;
}
}

public class OperaSub : IStrategy
{
public int DoOpera(int a, int b)
{
return a - b;
}
}

public class OperaMult : IStrategy
{
public int DoOpera(int a, int b)
{
return a * b;
}
}

/************************策略模式*************************/
public class Context
{
private IStrategy strategy;
public Context(IStrategy strategy)
{
this.strategy = strategy;
}
public int ExecuteStrategy(int a, int b)
{
return strategy.DoOpera(a, b);
}
}

Context context = new Context(new OperaAdd())
context.ExecuteStrategy(1, 1);
Context context = new Context(new OperaMult())
context.ExecuteStrategy(1, 1);
/********************************************************/

/************************简单工厂*************************/
class OperaFactory{
public static IStrategy GetOpera(string type){
IStrategy opera = null;
if(type.EqualsIgnoreCase("+")){
opera = new OperaAdd();
}
else if(type.EqualsIgnoreCase("-")){
opera = new OperaSub();
}
else if(type.EqualsIgnoreCase("*")){
opera = new OperaMult();
}
return opera;
}
}

IStrategy opera = ChartFactory.GetOpera("+");
opera.DoOprea(1, 1);
/********************************************************/