浅尝DesignPattern_Strategy

UML:

----------------------------------------------------------------------------------------------

SAMPLE:

Strategy.cs

1 abstract class Strategy
2 {
3 public abstract void AlgorithmInterface();
4 }

ConcreteStrategyA.cs

1 class ConcreteStrategyA:Strategy
2 {
3 public override void AlgorithmInterface()
4 {
5 Console.WriteLine("算法A实现");
6 }
7 }

ConcreteStrategyB.cs

1 class ConcreteStrategyB:Strategy
2 {
3 public override void AlgorithmInterface()
4 {
5 Console.WriteLine("算法B实现");
6 }
7 }

ConcreteStrategyC.cs

1 class ConcreteStrategyC:Strategy
2 {
3 public override void AlgorithmInterface()
4 {
5 Console.WriteLine("算法C实现");
6 }
7 }

Context.cs

1 class Context
2 {
3 Strategy strategy;
4 public Context(Strategy strategy)
5 {
6 this.strategy = strategy;
7 }
8 public void ContextInterface()
9 {
10 strategy.AlgorithmInterface();
11 }
12 }

①当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为.将这些行为封装在一个个独立的strategy类中,可以在使用这些行为的类中消除条件语句[DP].即"策略模式封装了变化".

②策略模式是用来封装算法的,但在时间中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性.

③在基本的处理模式中,选择所用具体实现的职责由客户端承担,封装给处理模式的context对象[DPE].策略模式和简单工厂模式结合后,选择具体实现的职责也可以由context来承担.

1 class Context
2 {
3 Strategy strategy;
4 public Context(string type)
5 {
6 switch (type)
7 {
8 case "A":
9 strategy = new ConcreteStrategyA();
10 break;
11 case "B":
12 strategy = new ConcreteStrategyB();
13 break;
14 case "C":
15 strategy = new ConcreteStrategyC();
16 break;
17 }
18 }
19 }
原文地址:https://www.cnblogs.com/TivonStone/p/1716491.html