zoukankan      html  css  js  c++  java
  • Decorator模式学习

    using System;

    namespace Decorator
    {
     abstract class Tank
     {
      abstract void Shot();
      abstract void Run();
     }
     public class T50:Tank
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }
     }
     public class T75:Tank
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }
     }
     public class T90:Tank
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }
     }
     public interface IA
     {
      void ShotA();
      void RunA();
     }


     public class T50A:Tank,IA
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }

      private void ShotA()
      {
       // TODO:  添加 T50A.ShotA 实现
      }

      private void RunA()
      {
       // TODO:  添加 T50A.RunA 实现
      }
     }
     public class T75A:Tank,IA
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }

      private void ShotA()
      {
       // TODO:  添加 T75.ShotA 实现
      }

      private void RunA()
      {
       // TODO:  添加 T75.RunA 实现
      }
     }
     public class T90A:Tank,IA
     {
      public override void Short()
      {
      }
      public override void Run()
      {
      }
      private void ShotA()
      {
       // TODO:  添加 T90.ShotA 实现
      }

      private void RunA()
      {
       // TODO:  添加 T90.RunA 实现
      }
     }
    }

    namespace Decorator2
    {
     public abstract class Tank
     {
      abstract void Shot();
      abstract void Run();
     }

     /// <summary>
     /// 抽象装饰类
     /// </summary>
     public abstract class Decorator:Tank//Do As接口继承
     {
      private Tank _tank;//Has-A对象组合

      public Decorator(Tank tank)
      {
       _tank=tank;
      }
      public  override void Shot()
      {
       _tank.Shot();
      }
      public override void Run()
      {
       _tank.Run();
      }
     }


     /// <summary>
     /// 下面A、B、C三个类是装饰类
     /// 装饰类的特点是“is a , has a”即继承Tank又包含一个Tank对象
     /// </summary>

     /// <summary>
     /// 红外功能
     /// </summary>
     public class DecoratorA:Decorator
     {
      public DecoratorA(Tank tank)
       :base(tank)
      {
      }
      public override void Shot()
      {
       //do some extension功能扩展

       //do shot..
       base.Shot();
      }
      public override void Run()
      {
       //do some extension功能扩展

       //do run..
       base.Run();
      }
     }


     /// <summary>
     /// 水路两栖
     /// </summary>
     public class DecoratorB:Decorator
     {
      public DecoratorB(Tank tank)
       :base(tank)
      {
      }
      public override void Shot()
      {
       //do some extension功能扩展

       //do shot..
       base.Shot();
      }
      public override void Run()
      {
       //do some extension功能扩展

       //do run..
       base.Run();
      }
     }


     /// <summary>
     /// 卫星定位
     /// </summary>
     public class DecoratorC:Decorator
     {
      public DecoratorC(Tank tank)
       :base(tank)
      {
      }
      public override void Shot()
      {
       //do some extension功能扩展

       //do shot..
       base.Shot();
      }
      public override void Run()
      {
       //do some extension功能扩展

       //do run..
       base.Run();
      }
     }

     /// <summary>
     /// /////////////////////////////////////////////////////////////
     /// </summary>

     public class T50:Tank
     {
      public override void Shot()
      {
      }
      public override void Run()
      {
      }
     }
     
     /// <summary>
     ///一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆性增长。
    ///另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类
    ///类爆炸”还只是现象,“类爆炸”的产生是由于某些类在多个维度或者说多个方向上的变化而造成的。
     /// 多继承可以作为一个“经验性的判断”来使用Decorator模式,但
     /// 应用要点绝非在此,而是解决“主体类(Tank)在多个方向上的扩展功能(Decorator)”的问题
     /// Decorator(扩展功能)的实质是一个Tank类的子类
     ///
     /// </summary>
     public class  App
     {
      public static void main()
      {
       Tank tank=new T50();

       //对象组合方案
       //通过采用组合而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力
       //而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”
       DecoratorA da=new DecoratorA(tank);//红外
       DecoratorB db=new DecoratorB(da);//红外、两栖
       DecoratorC dc=new DecoratorB(db);//红外、两栖、卫星定位


       dc.Shot();
      }
     }
    }


  • 相关阅读:
    Python中的魔法方法【技能突破】
    Python简明教程:面向对象【新手必学】
    No such file or directory
    LaTeX Error: File ''picins.sty'' not Found.
    GCC编译过程中的各种not declared in this scope
    20.有效的括号-力扣
    c++标准库bitset文件
    c++标准库windows.h文件
    warning: control reaches end of non-void function
    c++标准库iostream文件
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/347393.html
Copyright © 2011-2022 走看看