策略模式

来源:互联网 发布:阿里云磁盘快照 编辑:程序博客网 时间:2024/05/16 06:26
    最近开始看设计模式方面的书,《Head First 设计模式》是一本特别适合入门的书,里面用风趣的语言,搞笑的插图,让你跟着笔者一步一步的思考,每讲完一种模式,都会让你记忆深刻,强烈推荐想要学习设计模式的同学看看。作此记录,能让自己有更深的印象,其中大部分的内容都是该书中的,只不过这本书的语言是java
  开始第一种模式——策略模式
  定义:定义算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立使用算法的客户。
 个人理解:此模式将一些易改变的方法封装起来(用接口的方式),让其独立出来,与不需要改变的方法分开,这样可以应对当某些方法需要改变市,只需要改动算法,或者定义新的算法,代码如下
<pre class="csharp" name="code">    /// <summary>    /// 虚基类鸭子    /// </summary>    public abstract class Duck    {        /// <summary>        /// 飞行接口        /// </summary>        public FlyBehavior flyBehavior;        /// <summary>        /// 叫声接口        /// </summary>        public PerforQuark perforQuark;        /// <summary>        /// 显示        /// </summary>        public abstract void Display();        /// <summary>        /// 飞行方法        /// </summary>        public void PerformFly()        {            flyBehavior.Fly();        }        /// <summary>        /// 叫声方法        /// </summary>        public void PerformQuark()        {            perforQuark.Quark();        }        /// <summary>        /// 公用的方法,确定不会改变的        /// </summary>        public void Swim()        {            Console.WriteLine("游泳 所有的鸭子都会游泳");        }        /// <summary>        /// 设置飞行行为接口        /// </summary>        /// <param name="fb">飞行接口</param>        public void SetFlyBehavior(FlyBehavior fb)        {            flyBehavior = fb;        }        /// <summary>        /// 设置叫声接口        /// </summary>        /// <param name="qu">叫声接口</param>        public void SetQuackBehavior(PerforQuark qu)        {            perforQuark = qu;        }    }

这里定义了虚基类,里面有飞行和叫声接口,将飞行方法和叫声进行了封装,而对于都存在的游泳方法实现,这样把会改变的封装,并且定义了两个设置飞行和叫声的方法,这样可以在动态对方法进行改变
 /// <summary>    /// 飞行接口    /// </summary>    public interface FlyBehavior    {        void Fly();    }    /// <summary>    /// 可以飞行类    /// </summary>    public class FlyWithWings : FlyBehavior    {        public void Fly()        {            Console.WriteLine("可以飞");        }    }    /// <summary>    /// 不能飞行类    /// </summary>    public class FlyNoWay : FlyBehavior    {        public void Fly()        {            Console.WriteLine("不能飞");        }    }    /// <summary>    /// 火箭飞    /// </summary>    public class FlyWithRock : FlyBehavior    {        public void Fly()        {            Console.WriteLine("坐在火箭上飞");        }    }
这里定义飞行接口及实现接口的方法,将可能会改变的飞行方法定义接口,当有新的方法时,只需要增加类即可
    /// <summary>    /// 叫声接口    /// </summary>    public interface PerforQuark    {        void Quark();    }    /// <summary>    /// 嘎嘎叫方法    /// </summary>    public class Squeak : PerforQuark    {        public void Quark()        {            Console.WriteLine("嘎嘎");        }    }    /// <summary>    /// 嘻嘻方法    /// </summary>    public class MuteQuark : PerforQuark    {        public void Quark()        {            Console.WriteLine("嘻嘻");        }   }
叫声接口及子类实现
</pre><div><pre class="csharp" name="code">    /// <summary>    /// 子类鸭 鸭方法    /// </summary>    public class MallardDuck : Duck    {        public MallardDuck()        {            flyBehavior = new FlyWithWings();            perforQuark = new Squeak();        }        public override void Display()        {            Console.WriteLine("我是绿头鸭");        }    }
最后定义子类鸭,子类选择自己实现的飞行类和叫声类,这样不需要管具体的实现。

主方法
static void Main(string[] args)        {
            //生成鸭类            Duck duck = new MallardDuck();
            //调用方法            duck.PerformFly();            duck.PerformQuark();            duck.Swim();
            //可以动态改变实现方法            duck.SetFlyBehavior(new FlyWithRock());            duck.PerformFly();        }
以上就是一个简单的策略模式,该模式将变化的算法封装起来,并全能够在调用的时候进行算法的修改
三个原则:
1.封装变化
2.多用组合,少用继承
3.针对接口编程,不针对实现编程


0 0
原创粉丝点击