策略模式(Strategy Pattern)

以下場景:有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();
        }
    }

  

輸出結果:

我是超人我不會飛!我不會說話!我會飛!我說漢語!我是嬰兒我不會飛!我不會說話!

相關文章
相關標籤/搜索