策略模式(StragetyPattern)学习记录

来源:互联网 发布:爱淘宝女鞋新款 编辑:程序博客网 时间:2024/06/06 09:42

策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
本章提到三个设计原则:
一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
二:针对接口编程,而不是针对实现编程。
三:多用组合少用继承。
首先我们来看最重要的超类。

    public abstract class Duck    {        //抽象出飞行行为        public IFlyBehavior flyBehavior;        //抽象出叫的行为        public IQuackBehavior quackBehavior;        public abstract void display();        public void performQuack()        {            quackBehavior.quack();//委托给行为类        }        public void performFly()        {            flyBehavior.fly();//委托给行为类        }        public void swim()        {            Console.WriteLine("All ducks float,event decoys!");        }        public void setFlyBehavior(IFlyBehavior fb)        {            flyBehavior = fb;//可以动态设置行为(方便扩展)        }        public void setQuackBehavior(IQuackBehavior qb)        {            quackBehavior = qb;        }    }

仔细观察该类。飞和叫的行为被抽象出来了,因为并不是所有的鸭子都是会飞和会叫的。这就符合了设计原则的第一条,把可变的抽象出来。也是策略模式最重要的核心。抽象出可变的行为,交给perform来实现。而接口中只要定义叫和飞的行为就好。
接下来我们看看如何实现。定义一个绿头鸭,继承鸭子的超类。

    public class MallardDuck:Duck    {        public MallardDuck()        {            flyBehavior = new FlyWithWings();            quackBehavior = new Quack();        }        public override void display()        {            Console.WriteLine("I'm a real Mallard duck");        }    }

很简单只要在构造函数中实现飞和叫的行为就好了。
接下来调用验证

            Duck mallard = new MallardDuck();            mallard.display();            mallard.performQuack();            mallard.performFly();

对就是这么简单,就实现绿头鸭的功能了。
细心的人会发现在超鸭类中还有两个函数setFlyBehavior和setFlyBehavior两个方法,这两个方法是干什么用的呢,从代码上就可以看出是要动态设置飞行行为和叫的行为的。应用场景呢就是比如一个模型鸭是不会飞的,现在呢需要给模型鸭装上火箭动力。怎么办呢,其实这就用到动态设置鸭子行为的方法了。
首先我们先添加一个模型鸭类跟绿头鸭是一样的。

        public ModelDuck()        {            flyBehavior = new FlyNoWay();            quackBehavior = new Quack();        }        public override void display()        {            Console.WriteLine("I'm a model duck");        }

然后添加一个火箭动力的飞行行为

    public class FlyRocketPowered:IFlyBehavior    {        public void fly()        {            Console.WriteLine("I'm flying with a rocket!");        }    }

接下来调用模型鸭

            Duck model = new ModelDuck();            model.display();            model.performQuack();            model.setFlyBehavior(new FlyRocketPowered());            model.performFly();

重点就是setFlyBehavior方法,动态给模型鸭添加了火箭动力。
好了,策略模式就是这么多,重点也全部体现在超类Duck中。
第一次写这种类型的文章,哪里有不懂的欢迎留言问我。
也可以加群169767436私聊群主要源码。大家一起讨论学习,一起进步。

1 0
原创粉丝点击