zoukankan      html  css  js  c++  java
  • 设计模式之旅-策略者模式(组合模式)

    序言

    情景设计

    设计一款模拟鸭子的游戏,游戏中出现各种鸭子,一边游泳戏水,一边呱呱叫。所用的鸭子会呱呱叫,也会游泳,所以基类负责实现。但是每一款鸭子外观不一样,所以这是抽象行为。由子类实现。

    1. 前期设计及思路
      根据情景的设计,首先我们想到这是一些列的鸭子,便会想到利用继承的手段,进行解决。其UML图型为:
      这里写图片描述
      后续设计:需要让有的鸭子飞,有的鸭子不能飞。

    2. 后续设计
      问题:
      1、在调用中是通过抽象类进行操作的,所以新功能在超类有所体现,
      但是下载超类中实现,就所有的鸭子会飞。
      2、在超类中是飞的行为是抽象函数,这样每个子类都要实现,代码重写太复杂。
      3、用接口,只让飞的鸭子继承实现飞的行为接口,这样在超类中进行初始化接口。
      4、但是用接口后,让飞的行为进行修改,那个每个子类中飞的行为也要修改,这样改动也是很大。
      经过分析,利用组合的原则,将变化部分进行提取,封装一个新类,所以我们见fly这个行为提取出来,行为上肯定是接口,同时这个接口由行为类实现,而不是具体鸭子类实现,这样就实现策略模式。
      这里的接口就是所谓的概念,针对“利用接口编程”,关键在于多态。利用多态,程序可以对超类进行操作,根据实际情况执行到真正行为,将行为和对象进行解耦。
      在程序运行时就是针对超类编程,超类编程就是接口和抽象类。
      图为:这里写图片描述
      所以这样针对新行为,我们重新定义个接口,然后实现这个接口,在调用时初始化接口。
      其中主要的代码为:

    //关键这是超类,必定是抽象类
    public abstract class Duck
    {
         protected IFlyBehavior flyBehavior;
    
         protected QuackBehavior quackBehavior; 
    
        public virtual void Quack()
        {
            throw new System.NotImplementedException();
        }
        //当然这些行为也可通过接口,但是这游泳鸭子都会,所以超类直接实现
        public virtual void Swim()
        {
            throw new System.NotImplementedException();
        }
      //抽象函数,子类必须实现,意味子类这个行为不同
       public abstract void DisPlay();
    
        public virtual void performFly()
        {
        //通过接口执行fly行为,要寻找接口在那初始化
            flyBehavior.fly();
        }
    
    }
    //duck的子类,其中初始化了接口
    public class BlueDuck : Duck
    {
        public BlueDuck()
        {
        //初始化接口,在用BlueDuck初始化Duck时,接口也被初始化了。
            flyBehavior = new FlyWithWings();
        }
        public override void DisPlay()
        {
            throw new System.NotImplementedException();
        }
    }
    View Code

    总结

    当你将两个类结合起来使用时,如同本例,这就是组合。这种做法的不同是在于行为不是继承而来,单独通过行为类和接口进行实现。
    策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,使算法的变化独立于使用算法的客户。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    搭建Apache服务器并使用自签证书实现https访问
    常见加密算法
    awk命令用法
    systemd的新特性及常见的systemd unit类型分析
    kickstart文件制作与光盘镜像制作
    grub启动引导程序配置及命令行接口详解
    Linux启动流程(CentOS6)
    Linux相关网络命令
    rpm与yum,at与crontab,sed命令使用
    腾讯明眸极速高清升级2.0,助力韩国赛事超高清5G直播
  • 原文地址:https://www.cnblogs.com/polly333/p/4705682.html
Copyright © 2011-2022 走看看