首页 > 其他分享 >策略模式

策略模式

时间:2024-09-23 23:12:02浏览次数:7  
标签:Console 策略 子类 void 模式 class WriteLine public

1. 先做一个不那么恰当的例子

 //1.先做一个Duck class
    public abstract class SimUDuck
    {
        void quack()
        {
            Console.WriteLine("鸭子都会嘎嘎叫");
        }
        void swim()
        {
            Console.WriteLine("鸭子都会游泳");
        }
      public  abstract void display();//每个鸭子类型看起来都不一样,所以做成抽象方法

        //这样写在父类里面,那么不能飞的鸭子也继承了飞的行为,如下写是不对的:
        //void fly()
        //{
        //    Console.WriteLine("新增的需求:让某些鸭子能飞");
        //}

        public abstract void fly();//让子类自己去判断能不能飞,但是这样代码量会变大,因为每一个继承它的子类都要复写一遍这个方法
    }

    class MallardDuck : SimUDuck
    { 
        public override void display() 
        {
            Console.WriteLine("看起来像绿头鸭");
        }
        public override void fly() 
        {
            Console.WriteLine("绿头鸭会飞");
        }
    }

    class RedHeadDuck : SimUDuck
    {
        public override void display()
        {
            Console.WriteLine("看起来像红头鸭");
        }

        public override void fly()
        {
            Console.WriteLine("红头鸭会飞");
        }
    }

    class RubberDuck : SimUDuck
    {
        public override void display()
        {
            Console.WriteLine("看起来像橡皮鸭");
        }

        public override void fly()
        {
            Console.WriteLine("橡皮鸭会飞的方法写成空,表示橡皮鸭不能飞");//代码量会变大,因为每一个继承它的子类都要复写一遍这个方法,这样也是不行的
        }
    }

在上面的例子里面:

  • 鸭子的叫声和游泳可能也是变化的,在父类中写定了是不行的
  • 如果在父类中写定一个飞的实例方法,子类继承后,那么本来不应该会飞的子类也有了会飞的特性了。
  • 如果父类方法全部做成抽象类,每一次子类的继承就要去重写一遍父类方法,就算有些鸭子不会飞,那也要重写为不会飞,这也是很低效的。

2. 用接口和算法簇实现

//1.先做一个Duck class
    public abstract class SimUDuck
    {
        //声明接口的引用关联关系
        public IFlyBehavior flyBehavior;
        public IQuackBehavior quackBehavior;
        public void performFly()//父类不具体实现飞的方法,委托给接口
        {
            flyBehavior.fly();
        }
       public void performQuack() //父类不具体实现叫的方法,委托给接口
        {
            quackBehavior.quack();
        }
        void swim()//所有父类和子类都一致的方法
        {
            Console.WriteLine("鸭子都会游泳");
        }
        public void setFlyBehavior(IFlyBehavior fb)//这两个方法用来动态实现具体的方法,而不是像原来一样写在构造函数里
        {
            flyBehavior = fb;
        }
        public void setQuackBehavior(IQuackBehavior qb)
        {
            quackBehavior = qb;
        }
        public abstract void display();//每个子类的都有的方法,但是每个子类的表现却不一样,所以做成抽象方法子类重写
    }

    class MallardDuck : SimUDuck
    {
        public MallardDuck()
        {
            base.quackBehavior = new Quack();//使用父类的字段
            base.flyBehavior = new FlyWithWings();
        }
        public override void display()
        {
            Console.WriteLine("看起来像绿头鸭");
        }
    }

    class RedHeadDuck : SimUDuck
    {
        public override void display()
        {
            Console.WriteLine("看起来像红头鸭");
        }
    }

    class RubberDuck : SimUDuck
    {
        public override void display()
        {
            Console.WriteLine("看起来像橡皮鸭");
        }
    }
    class DecoyDuck : SimUDuck
    {
        public override void display()
        {
            Console.WriteLine("看起来像诱饵鸭");
        }
    }
    class FlyWithWings:IFlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("有翅膀可以飞");
        }
    }
    class FlyNoWay : IFlyBehavior
    {
        public void fly()
        {
            Console.WriteLine("没有翅膀不能飞");
        }
    }
    class Quack: IQuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("嘎嘎叫");
        }
    }
    class Squeack: IQuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("吱吱叫");
        }
    }
    class MuteQuack: IQuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("不会叫");
        }
    }
    public interface IFlyBehavior//把变化的飞行行为做成接口
    {
        void fly();
    }
    public interface IQuackBehavior//把变化的叫声行为做成接口
    {
        void quack();
    }
  • 实现写在具体的类里面
  • 父类关联具体的接口,实现算法的具体类关联接口
  • 接口的方法被具体的类实现
  • 策略模式

标签:Console,策略,子类,void,模式,class,WriteLine,public
From: https://www.cnblogs.com/xiacuncun/p/18428160

相关文章

  • c#代码介绍23种设计模式_07适配器模式
    目录1、适配器模式2、类的适配器模式实现(ClassAdapterPattern.cs)3、对象的适配器模式实现(ObjectAdapterPattern.cs)4、适配器模式的优缺点4-1.类的适配器模式:4-2.对象的适配器模式5、使用场景6、.NET中适配器模式的实现7、实现思路1、适配器模式在实际的开发......
  • AIGC从入门到实战:AIGC 在教育行业的创新场景—苏格拉底式的问答模式和AIGC 可视化创新
    AIGC从入门到实战:AIGC在教育行业的创新场景—苏格拉底式的问答模式和AIGC可视化创新作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming1.背景介绍1.1问题的由来随着人工智能技术的飞速发展,人工智能生成内容(AIGC,ArtificialIntelligenceGenera......
  • 个性化电商系统之订单物流分拆策略示例代码
    个性化电商系统中的订单物流分拆是一个复杂但至关重要的功能,它涉及到如何将一个订单中的多个商品根据不同的配送策略进行分拆,以优化物流成本和提高配送效率。下面我们将详细解析订单物流分拆的思路,并提供一些源码示例。一、订单物流分拆策略1、订单分析:首先,系统需要分析订单中每个......
  • Spark(六)运行模式(二)
    Yarn模式1、解压缩文件[user@hadoop102software]$tar-zxvfspark-3.0.0-bin-hadoop3.2.tgz-C/opt/module[user@hadoop102software]$cd/opt/module[user@hadoop102module]$mvspark-3.0.0-bin-hadoop3.2spark-yarn2、修改配置文件(1)修改hadoop配置文件/opt/module......
  • 代理模式 - 动态代理
    动态代理的APIProxy动态代理类生成代理对象:Proxy.newProxyInstance(类加载器,接口数组,处理器)类加载器:对象.getClass().getClassLoader()接口数组-被代理类的所有接口:被代理对象.getClass().getInterfaces()处理器:代理对象调用方法时,会被处理器拦截InvocationHa......
  • 阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
    大家好,我是V哥,粉丝小A面试阿里,说被问到Redis的内存淘汰策略的问题,整理这个笔记给他参考,也分享给大家,如果你遇到这个问题,会怎么回答呢?Redis的内存淘汰策略是指当Redis的内存使用量达到设定的上限时,决定哪些数据应该被移除以便为新数据腾出空间的规则。Redis提供了多种内存淘......
  • 云设计模式介绍
    云设计模式介绍以及它们如何帮助应对分布式计算的谬误   作为构建分布式系统的软件工程师,我们经常遇到诸如不可靠的网络、延迟问题和安全问题等挑战。"分布式计算的谬误"描述了如果未解决,可能导致系统故障的常见误解。但认识到这些陷阱只是开始。真正的问题是:我们如何有效地克......
  • 谷歌老户的优势及优化策略,增加曝光度方法介绍
    谷歌老户(已存在一段时间并积累了历史数据的账户)通常具有较高的权重和稳定性,这使其在投放广告时可以更快速地增加流量并保持稳定的表现。以下是一些策略和建议,帮助您最大化利用谷歌老户的优势。一、它的优势:账户权重高:谷歌广告系统通常会给予历史良好表现的账户更高的权重,这......
  • SpringBoot框架下的客户管理策略
    1绪论1.1研究背景随着网络不断的普及发展,企业客户管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、项目类型管理、项目收益管理功能,利......
  • 基于django+vue基于O2O模式的外卖订餐系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已渗透到人们生活的方方面面,其中外卖订餐系统作为“互联网+餐饮”的典型代表,近年来在全球范围内迅速崛......