如下场景:有2类人或者多类人,超人和婴儿,超人会说汉语并且会飞,婴儿不会说并且更不会飞,有一天婴儿长大了就会说英语了,但是不会飞;建立设计模式生成以上两类人(以后可能会是多类人)

设计模式3原则:

1.把变化的与不变化的分开;

2.面向接口编程不要面向实现类编程;

3.多用“组合”少用继承;

实现见代码:

//飞接口
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);
       }
    }

  

测试一下:

 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();
        }
    }

  

输出结果:

我是超人
我不会飞!
我不会说话!
我会飞!
我说汉语!
我是婴儿
我不会飞!
我不会说话!

01-12 04:45