策略模式

来源:互联网 发布:算法工程师课程 编辑:程序博客网 时间:2024/06/07 11:03

策略模式是把算法和使用算法的客户分离,使用组合的方式让他们之间产生联系的方法。

复用是继承具有的最大优势之一,但同时也可能给维护带来很大的包袱。

比如在使用多态时,有些子类的具体行为可能有区别,这时你的第一反应可能是覆盖这个方法,但如果这个区别在一直拓展呢?你要把每个子类中的方法全部覆盖一遍么,那么继承还有存在的意义吗?

这种情况就是策略模式登场的时候了。

策略模式的方法是:把这些行为与超类分离,单独封装,子类采用组合的方式自己实现自己的各种行为。超类不知道,也不关心每个子类具体的行为是什么,只知道子类具有这些行为就可以了。这样,既有了继承带来的复用的好处,又不会出现上面所出现的被实现绑死的问题,整个结构变得更加灵活,可拓展。

下面看一下代码:

飞行行为的接口:

    public interface FlyBehaviour    {        void Fly();    }具体飞行行为1:    public class FlyWithWings : FlyBehaviour    {        public void Fly()        {            Console.WriteLine("用翅膀飞");        }    }具体飞行行为2:    public class FlyNoWings : FlyBehaviour    {        public void Fly()        {            Console.WriteLine("没有翅膀飞不起来");        }    }叫声行为的接口:    public interface QuackBehavior    {        void Quack();    }具体叫声行为1:    public class QuackGua : QuackBehavior    {        public void Quack()        {            Console.WriteLine("呱呱叫");        }    }具体叫声行为2:    public class QuackGa : QuackBehavior    {        public void Quack()        {            Console.WriteLine("嘎嘎叫");        }    }超类:超类具有行为1和行为2的具体实例,这样所有子类都拥有这两个行为,但是超类不知道也不关心子类具体是什么行为!而且超类应该制造两个公有方法给外界调用这两个行为,以保护两个行为的实例。因为所有鸭子都具有游的行为,所以所有子类直接复用就好。    public abstract class Duck    {        protected FlyBehaviour flyB;        protected QuackBehavior quackB;        public void ShowFly()        {            flyB.Fly();        }        public void ShowQuack()        {            quackB.Quack();        }        public void Swim()        {            Console.WriteLine("游啊游");        }    }子类1:子类自己决定具体的飞行行为和叫声行为是什么!    public class RedheadDuck : Duck    {        public RedheadDuck()        {            flyB = new FlyWithWings();            quackB = new QuackGua();        }    }子类2:子类自己决定具体的飞行行为和叫声行为是什么!    public class DonaldDuck : Duck    {        public DonaldDuck()        {            flyB = new FlyNoWings();            quackB = new QuackGa();        }    }    class Program    {        static void Main(string[] args)        {            Duck duck1 = new RedheadDuck();            duck1.ShowFly();            duck1.ShowQuack();            Duck duck2 = new DonaldDuck();            duck2.ShowFly();            duck2.ShowQuack();        }    }


原创粉丝点击