意图:
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。
——《设计模式》GoF
code
1 using System;
2
3 namespace DoFactory.GangOfFour.Strategy.Structural
4 {
5 /// <summary>
6 /// MainApp startup class for Structural
7 /// Strategy Design Pattern.
8 /// </summary>
9 class MainApp
10 {
11/// <summary>
12/// Entry point into console application.
13/// </summary>
14static void Main()
15{
16 Context context;
17
18 // Three contexts following different strategies
19 context = new Context(new ConcreteStrategyA());
20 context.ContextInterface();
21
22 context = new Context(new ConcreteStrategyB());
23 context.ContextInterface();
24
25 context = new Context(new ConcreteStrategyC());
26 context.ContextInterface();
27
28 // Wait for user
29 Console.ReadKey();
30}
31 }
32
33 /// <summary>
34 /// The 'Strategy' abstract class
35 /// </summary>
36 abstract class Strategy
37 {
38public abstract void AlgorithmInterface();
39 }
40
41 /// <summary>
42 /// A 'ConcreteStrategy' class
43 /// </summary>
44 class ConcreteStrategyA : Strategy
45 {
46public override void AlgorithmInterface()
47{
48 Console.WriteLine(
49 "Called ConcreteStrategyA.AlgorithmInterface()");
50}
51 }
52
53 /// <summary>
54 /// A 'ConcreteStrategy' class
55 /// </summary>
56 class ConcreteStrategyB : Strategy
57 {
58public override void AlgorithmInterface()
59{
60 Console.WriteLine(
61 "Called ConcreteStrategyB.AlgorithmInterface()");
62}
63 }
64
65 /// <summary>
66 /// A 'ConcreteStrategy' class
67 /// </summary>
68 class ConcreteStrategyC : Strategy
69 {
70public override void AlgorithmInterface()
71{
72 Console.WriteLine(
73 "Called ConcreteStrategyC.AlgorithmInterface()");
74}
75 }
76
77 /// <summary>
78 /// The 'Context' class
79 /// </summary>
80 class Context
81 {
82private Strategy _strategy;
83
84// Constructor
85public Context(Strategy strategy)
86{
87 this._strategy = strategy;
88}
89
90public void ContextInterface()
91{
92 _strategy.AlgorithmInterface();
93}
94 }
95 }
说明:源代码来自DoFactory