首页 > 其他 > 详细

策略模式(Strategy Pattern)

时间:2019-11-07 15:27:45      阅读:94      评论:0      收藏:0      [点我收藏+]

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

  

输出结果:

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

策略模式(Strategy Pattern)

原文:https://www.cnblogs.com/ZHXI/p/11811791.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!