策略模式(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();
        }
    }

  

输出结果:

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

相关文章
相关标签/搜索