每天一小段筆記-策略模式(Stategy Pattern),stategypattern
知識點
- 找出引用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起。
- 針對接口編程,而不是實現編程。
- 多用組合,少用繼承
示例
1 public interface FlyBehavior
2 {
3 void Fly();
4 }
5
6 class FlyWithWings:FlyBehavior
7 {
8 #region FlyBehavior 成員
9
10 public void Fly()
11 {
12 Console.WriteLine("會飛的鴨子");
13 }
14
15 #endregion
16 }
17
18 public class FlyNoWay:FlyBehavior
19 {
20 #region FlyBehavior 成員
21
22 public void Fly()
23 {
24 Console.WriteLine("飛不起來的");
25 }
26
27 #endregion
28 }
飛行行為
1 public interface QuackBehavior
2 {
3 void Quack();
4 }
5
6 class Quack:QuackBehavior
7 {
8 #region QuackBehavior 成員
9
10 void QuackBehavior.Quack()
11 {
12 Console.WriteLine("嘎!嘎!嘎!");
13 }
14
15 #endregion
16 }
17
18 class MuteQuack:QuackBehavior
19 {
20 #region QuackBehavior 成員
21
22 public void Quack()
23 {
24 Console.WriteLine("世界一片安靜");
25 }
26
27 #endregion
28 }
叫行為
1 public abstract class Duck
2 {
3 //將鴨子的行為通過組合的方式使用,而不是繼承
4 FlyBehavior _flyBehavior;
5 QuackBehavior _quackBehavior;
6
7 public FlyBehavior FlyBehavior
8 {
9 set { _flyBehavior = value; }
10 }
11
12 public QuackBehavior QuackBehavior
13 {
14 set { _quackBehavior = value; }
15 }
16
17 public abstract void Display();
18
19 public void PerformFly()
20 {
21 _flyBehavior.Fly();
22 }
23 public void PerformQuack()
24 {
25 _quackBehavior.Quack();
26 }
27 }
鴨子抽象類
1 class RedheadDuck:Duck
2 {
3 public override void Display()
4 {
5 Console.WriteLine("紅頭鴨");
6 }
7 }
實現類紅頭鴨
1 class Program
2 {
3 static void Main(string[] args) {
4 Duck duck = new RedheadDuck() {
5 FlyBehavior=new FlyWithWings(),
6 QuackBehavior=new Quack()
7 };
8 duck.Display();
9 duck.PerformFly();
10 duck.PerformQuack();
11
12 Console.ReadKey();
13 }
14 }
定義
定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
小結
將主體類的行為分開放在別的類中,這個類就專門用來提供行為接口的實現,這樣主體類就不再需要關注行為的實現細節。
就像上面的代碼中,紅頭鴨的飛行為,放在了FlyWithWings類中,這個類實現了一個飛行為的接口,具體怎麼飛,在紅頭鴨的類中我們不需要知道,只要交給FlyWithWings類就行。