策略模式(StragetyPattern)学习记录

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

    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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值