標籤:世界 pre 分享圖片 基於 原則 bst 使用 系統 內容
首先需要說明的是該系列的所有內容都是基於headfirst設計模式來描述的。因為我之前也看過不少關於設計模式的書,還是發現這本最好,因為這本書裡面給出的例子是最貼切實際的。不說了,開始這個系列吧!
策略模式
設計原則①:找出應用中可能需要變化的地方,把他們獨立出來,不要和那些不變的代碼混合在一起。把會變化的部分提取出來,以便以後能夠輕易的對這部分進行擴充或改動,而不會影響到不變的那部分代碼。這樣,代碼變化引起的不經意後果變少,系統變得更有彈性。
設計原則②:針對介面編程,而不是針對實現進行編程。從現在開始,變化的部分被抽象到介面中,這樣,鴨子就不用知道行為的具體實現了。
設計原則③:多用組合,少用繼承。
策略模式定義:定義了演算法族,分別封裝起來,讓他們之間可以互相替換。此模式讓演算法的變化獨立於使用演算法的客戶。
背景:joe設計了一個鴨子遊戲,這裡面所有的鴨子都有一個基類,所有的鴨子都從這個基類來繼承一致的行為,但是這樣的設計忽略了一個重要的因素:變化。不是所有的子類都具有相似的行為,那這個世界也就不再精彩了。
下面是針對這個模式對鴨子遊戲進行的設計:
public abstract class Duck { public string Color { get; set; } public string Name { get; set; }//假設鴨子有一個名字 private IQuackable _quackable; private IFlyable _flyable; protected Duck(IQuackable quack,IFlyable fly) { _quackable = quack; _flyable = fly; } public override string ToString() { return $"my name is {Name},i am {Color}"; } public virtual void Swim() { Console.WriteLine("all duck can swim"); } }public interface IQuackable { void Quack(); } public interface IFlyable { void Fly(); } public class ICanQuack : IQuackable { public void Quack() { Console.WriteLine("i can quack"); } } public class ICanFly:IFlyable { public void Fly() { Console.WriteLine("i can fly"); } }
首先對鴨子設計了一個基類,這個基類是一個抽象類別,所有其他的鴨子都會從這裡繼承。重要的是對鴨子的叫和飛這兩種行為進行了抽離,做成了介面,因為不是所有的鴨子都會飛,也不是所有的鴨子都會叫。這樣,我們在定義一個鴨子子類的時候,可以針對這種鴨子的特性進行編程。也就提高了系統的彈性。其中,將鴨子的一些行為獨立出來這個符合上面提到的設計原則①,Duck類中針對的是兩個介面來擷取具體的行為這個符合設計原則②,將那兩個介面作為Duck的欄位符合設計原則③。
C#設計模式之1:策略模式