大话设计模式读书笔记5——装饰模式

装饰模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

装饰模式结构图:

装饰模式实现代码:

复制代码
    /// <summary>
    /// 声明一个Component的抽象基类
    /// </summary>
    abstract class Component
    {
        public abstract void Operation();
    }

    /// <summary>
    ///声明一个具体的Component,继承Component
    /// </summary>
    class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("ConcreteComponent.Operation()");
        }
    }

    /// <summary>
    /// 声明一个抽象的装饰类'Decorator'
    /// 并继承Component
    /// </summary>
    abstract class Decorator : Component
    {
        protected Component component;

        //装饰方法
        public void SetComponent(Component component)
        {
            this.component = component;
        }

        //重写 Operation 方法
        public override void Operation()
        {
            if (component != null)
            {
                component.Operation();
            }
        }
    }

    /// <summary>
    /// 声明一个具体装饰类A,继承Decorator
    /// </summary>
    class ConcreteDecoratorA : Decorator
    {
        public override void Operation()
        {
            //一些功能扩展
            Console.WriteLine("ConcreteDecoratorA.Operation()");
            base.Operation();            
        }
    }

    /// <summary>
    /// 声明一个具体装饰类B,继承Decorator
    /// </summary>
    class ConcreteDecoratorB : Decorator
    {
        public override void Operation()
        {
           //一些功能扩展
            AddedBehavior();
            Console.WriteLine("ConcreteDecoratorB.Operation()");
            base.Operation();
        }

        //装饰类B自有方法
        void AddedBehavior()
        {
        }
    }

 class Program
    {
        static void Main(string[] args)
        {  
            ConcreteComponent c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();
           
            d1.SetComponent(c);
            d2.SetComponent(d1);
            d2.Operation();
           
            Console.ReadKey();
        }
    }
复制代码

  执行结果:

 我们可以通过一个简单是实例,还应用一下装饰模式,比如现在有一种坦克,坦克有很多的型号和特色,有的具有红外功能,有的具有GPS定位功能,通过使用装饰模式,大大降低了子类的膨胀。

复制代码
 //坦克基类
    public class Tank
    {
        /// <summary>
        /// 射击
        /// </summary>
        public virtual void Shoot()
        {

        }

    }

    //T50 型坦克
    public class T50Tank:Tank
    {
        public override void Shoot()
        {
            Console.WriteLine("T50 型号坦克射击");
        }
    }

    //T51型坦克
    public class T51Tank : Tank
    {
        public override void Shoot()
        {
            Console.WriteLine("T51 型号坦克射击");
        }
    }

    //装饰基类
    public abstract class Decorator : Tank
    {
        protected Tank tank;

        //利用构造器进行装饰
        public Decorator(Tank tank)
        {
            this.tank = tank;
        }          

        public override void Shoot()
        {
            if (tank != null)
            {
                tank.Shoot();
            }
        }
    }

    //具有红外功能
    public class InfraRed : Decorator
    {
        public InfraRed(Tank tank)
            : base(tank)
        {

        }
    
        public override void Shoot()
        {
            Console.WriteLine("带红外功能");
            base.Shoot();
        }
    }

    //具有GPS功能
    public class GPS : Decorator
    {
        public GPS(Tank tank)
            : base(tank)
        {

        }
        public override void Shoot()
        {
            Console.WriteLine("带GPS功能");
            base.Shoot();
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            //声明一个T50型坦克
            Tank t50Tank = new T50Tank();
            //给T50型坦克赋予红外功能
            InfraRed red = new InfraRed(t50Tank);
            //给T50型坦克赋予GPS功能
            GPS gps = new GPS(red);
            gps.Shoot();          

            Console.ReadKey();
        }
    }
复制代码

 执行结果:

posted @   Rising_Sun  阅读(3489)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示