以下場景:有2類人或者多類人,超人和嬰兒,超人會說漢語而且會飛,嬰兒不會說而且更不會飛,有一天嬰兒長大了就會說英語了,可是不會飛;創建設計模式生成以上兩類人(之後可能會是多類人)算法
設計模式3原則:編程
1.把變化的與不變化的分開;設計模式
2.面向接口編程不要面向實現類編程;測試
3.多用「組合」少用繼承;spa
策略模式:定義了算法族,分別封裝起來,讓他們之間能夠相互替換,此模式讓算法的變化獨立於使用算法的客戶。設計
實現見代碼:blog
//飛接口 public interface IFly { void Fly(); } //說的接口 public interface ILanguage { void SpeakLanguage(); } //抽象基類 public abstract class People { public IFly Fly; public ILanguage Language; public string Name { get; set; } public void BegainFly() { Fly.Fly(); } public void Speak() { Language.SpeakLanguage(); } public void SetFly(IFly f) { Fly = f; } public void Setlanguage(ILanguage l) { Language = l; } }
針對接口實現類:繼承
class CanFly:IFly { public void Fly() { Console.WriteLine("我會飛!"); } } class CannotFly:IFly { public void Fly() { Console.WriteLine("我不會飛!"); } } public class ChineseLanguage:ILanguage { public void SpeakLanguage() { Console.WriteLine("我說漢語!"); } } class EnglishLanguage:ILanguage { public void SpeakLanguage() { Console.WriteLine("I Speeak English!"); } } class NoEnableSpeakLanguage:ILanguage { public void SpeakLanguage() { Console.WriteLine("我不會說話!"); } }
具體實現人物類:接口
public class SuperMan:People { public SuperMan() { Name = "我是超人"; Fly = new CannotFly(); Language = new NoEnableSpeakLanguage(); Console.WriteLine(Name); } } public class Baby:People { public Baby() { Name = "我是嬰兒"; Language = new NoEnableSpeakLanguage(); Fly = new CannotFly(); Console.WriteLine(Name); } }
測試一下:get
class Program { static void Main(string[] args) { People p = new SuperMan(); p.BegainFly(); p.Speak(); p.SetFly(new CanFly()); p.Setlanguage(new ChineseLanguage()); p.BegainFly(); p.Speak(); p = new Baby(); p.BegainFly(); p.Speak(); Console.ReadKey(); } }
輸出結果:
我是超人我不會飛!我不會說話!我會飛!我說漢語!我是嬰兒我不會飛!我不會說話!