8 Strategy模式
8.1 概述
策略模式主要应用于多种方法解决一个问题中,或一个东西有多种做法,现在只选择其中一种方法,将来可能会用另一种方法。就像一道题有多种算法,需要把这些不同的算法封装起来,达到使用无差别化。
8.2 设计
这个模式类似于Bridge模式,但是Bridge模式是为了封装实现部分,Strategy模式是为了封装某个步骤的多种算法。Strategy把这些算法抽象成一个类,直接使用其子类的对象实现具体的算法。
8.3 实现
UML图:
1using System;
2using System.Collections ;
3
4namespace Example
5{
6 /// <summary>
7 /// 示例
8 /// </summary>
9 class Example
10 {
11 /// <summary>
12 /// 应用程序的主入口点。
13 /// </summary>
14 [STAThread]
15 static void Main(string[] args)
16 {
17 Context c = new Context() ;
18 c.ContextInterface() ;
19 }
20 /// <summary>
21 /// 使用策略的类
22 /// </summary>
23 public class Context
24 {
25 private Strategy s = null ;
26 public void ContextInterface()
27 {
28 s = new ConcreteStrategyB() ;//决定使用哪个策略
29 s.AlgorithmInterface() ;
30 }
31 }
32 /// <summary>
33 /// 策略抽象类,封装实现策略的接口
34 /// </summary>
35 public abstract class Strategy
36 {
37 public abstract void AlgorithmInterface() ;
38 }
39 /// <summary>
40 /// A策略
41 /// </summary>
42 public class ConcreteStrategyA : Strategy
43 {
44 public override void AlgorithmInterface()
45 {
46 Console.WriteLine( "实现A算法" ) ;
47 }
48 }
49 /// <summary>
50 /// B策略
51 /// </summary>
52 public class ConcreteStrategyB : Strategy
53 {
54 public override void AlgorithmInterface()
55 {
56 Console.WriteLine( "实现B算法" ) ;
57 }
58 }
59 /// <summary>
60 /// C策略
61 /// </summary>
62 public class ConcreteStrategyC : Strategy
63 {
64 public override void AlgorithmInterface()
65 {
66 Console.WriteLine( "实现C算法" ) ;
67 }
68 }
69 }
70}
71
2using System.Collections ;
3
4namespace Example
5{
6 /// <summary>
7 /// 示例
8 /// </summary>
9 class Example
10 {
11 /// <summary>
12 /// 应用程序的主入口点。
13 /// </summary>
14 [STAThread]
15 static void Main(string[] args)
16 {
17 Context c = new Context() ;
18 c.ContextInterface() ;
19 }
20 /// <summary>
21 /// 使用策略的类
22 /// </summary>
23 public class Context
24 {
25 private Strategy s = null ;
26 public void ContextInterface()
27 {
28 s = new ConcreteStrategyB() ;//决定使用哪个策略
29 s.AlgorithmInterface() ;
30 }
31 }
32 /// <summary>
33 /// 策略抽象类,封装实现策略的接口
34 /// </summary>
35 public abstract class Strategy
36 {
37 public abstract void AlgorithmInterface() ;
38 }
39 /// <summary>
40 /// A策略
41 /// </summary>
42 public class ConcreteStrategyA : Strategy
43 {
44 public override void AlgorithmInterface()
45 {
46 Console.WriteLine( "实现A算法" ) ;
47 }
48 }
49 /// <summary>
50 /// B策略
51 /// </summary>
52 public class ConcreteStrategyB : Strategy
53 {
54 public override void AlgorithmInterface()
55 {
56 Console.WriteLine( "实现B算法" ) ;
57 }
58 }
59 /// <summary>
60 /// C策略
61 /// </summary>
62 public class ConcreteStrategyC : Strategy
63 {
64 public override void AlgorithmInterface()
65 {
66 Console.WriteLine( "实现C算法" ) ;
67 }
68 }
69 }
70}
71