大话设计模式读书笔记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();
        }
    }

执行结果:

时间: 2024-10-29 19:11:20

大话设计模式读书笔记5——装饰模式的相关文章

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

大话设计模式读书笔记2——单例模式

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 我们来看一下单例模式下的饿汉模式代码: /// <summary> /// 饿汉模式 /// </summary> public class Singleton { //私有的构造器 private Singleton() {

大话设计模式读书笔记--设计模式总结

前言 大话设计模式看了两遍,之前看过一遍,理解的不深刻, 这次用了一个月多点的时间再次温习,利用下班后的时间回来学习,把学习心得记录下来,加深了对面向对象的理解 之前是看到一个需求搞清楚业务流程之后立刻就去做了,很少从设计层面的角度考虑,现在在开发程序时,开始有了设计的思想,也有了达到可维护,可复用,可扩展目的具体的实现方法 每当看到经过优化代码的效果时,就想起一句话:精彩的代码是如何想出来的,比看到精彩的代码更加令人兴奋 下面是用自己的话进行的总结,以便加深记忆和理解 创建型 抽象工厂 定义:

设计模式(&quot;大话设计模式&quot;读书笔记 C#实现)

前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式? 设计模式的存在就是为了抵御需求变更.学会了这些思想,开始一个项目的时候考虑的更多,当用户提出变更的时候项目改动更少. 2.怎么才能学会设计模式? 我不知道,不过轮子哥(vczh)文章中的一句话,我觉得对,就是:“设计模式就是因为情况复杂了所以才会出现的,所以我们只能通过复杂的程序来学习设计模式.

大话设计模式读书笔记(一)

上周从同事那里搞到一本大话设计模式的书,便看了起来,对于我这种非科班出身的人来说,还是很有用处的.这些设计模式的终极目的都是让代码更好看,更好用,更好拓展,在需求变化的时候,尽可能少的改动代码 先记录自己已经学到的几个部分: 1.开放——封闭原则 软件实体对于拓展的开放的,对于修改时封闭的.及对已经写好的类来说尽力避免修改,可以通过拓展其父类来实现对他的修改.增强可维护性. 2.单一职责原则 就一个类而言,应该只有一个引起它变化的原因 具体而言,如果你能想到多于一个动机去改变一个类,那么这个类就

大话设计模式读书笔记4——模版方法模式

模板方法是一种常见的设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML图: 具体实现代码: namespace TemplateMethod { class Program { static void Main(string[] args) { AbstractClass A = new ConcreteClassA(); A.TemplateMethod(); AbstractClass B = new

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

大话设计模式读书笔记--5个原则

单一职责原则 定义: 就一个类而言,应该仅有一个引起它变化的原因 如果你能想到多余一个的动机去改变一个类,那么这个类就具有对于一个的职责,就应该考虑类的职责分离 职责过多的坏处 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其它职责的变化,这些耦合会导致脆弱的设计,当发生变化时,设计会遭受意想不到的破坏 开发中 软件设计的重要部分,就是发现职责,并把职责相互分离 开放封闭原则 定义: 软件实体(类,函数,模块等),应该可以扩展,但是不可以修改 面对