设计模式之六(装饰模式)

原文:设计模式之六(装饰模式)

前言

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

装饰模式结构图

 

Component是定义一个对象接口,可以给这些对象动态添加职责

ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责

Decorator装饰抽象类,继承了Component,从外类来扩展Componnt类的功能,但对于Component来说,是无需知道Decorator的存在的

代码实现

Component类

    public abstract class Component
    {
        public abstract void Operation();
    }

ConcreteComponnet类

    public class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("具体对象的操作");
        }
    }

Decorator类

    public abstract class Decorator : Component
    {
        protected Component component;

        /// <summary>
        /// 设置Component
        /// </summary>
        /// <param name="component"></param>
        public void SetComponent(Component component)
        {
            this.component = component;
        }

        /// <summary>
        /// 重写Operation,实际执行的是Component的Operation
        /// </summary>
        public override void Operation()
        {
            if (component != null)
            {
                component.Operation();
            }
        }
    }

ConcreteDecoratorA

    public class ConcreteDecoratorA : Decorator
    {
        /// <summary>
        /// 本类独有功能,以区别于ConcreteDecoratorB
        /// </summary>
        private string AddedState;

        public override void Operation()
        {
            base.Operation();
            AddedState = "NewState";
            Console.WriteLine("具体装饰对象A的操作");
        }
    }

ConcreteDecoratprB

    public class ConcreteDecoratorB : Decorator
    {
        public override void Operation()
        {
            base.Operation();

        }

        /// <summary>
        /// 本类独有的方法,以区别于ConcreteDecoratorA
        /// </summary>
        private void AddedBehavior()
        {
            ///
        }
    }

客户端调用实例

    public class Program
    {
        static void Main(string[] args)
        {
            ConcreteComponent cc = new ConcreteComponent();
            ConcreteDecoratorA ca = new ConcreteDecoratorA();
            ConcreteDecoratorB cb = new ConcreteDecoratorB();

            ca.SetComponent(cc);
            cb.SetComponent(ca);
            cb.Operation();
            Console.ReadLine();
        }
    }

装饰的方式是:首先用ConcreteComponent实例化cc,然后用ConcreteComponentA的实例化对象ca来包装cc,再用ConcreteComponetB的对象cb包装ca,最终执行cb的Operation()

其实就是利用Setcomponent来对对象进行包装的。这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。

 

不过也有特殊情况:如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没必要建立单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。

总结

 装饰模式就是为已有功能动态添加更多功能的一种方式。

优点可以这样说:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了。

 

时间: 2024-10-28 11:24:06

设计模式之六(装饰模式)的相关文章

乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:webabcd 介绍 动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活. 示例 有一个Message实体类,某个对象对它的操作有Insert()和Get()方法,现在扩展这个对象的功能. MessageModel using System;using System.Collecti

【设计模式】—— 装饰模式Decorator

模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下,为对象动态的添加某些操作. 2 处理一些可以撤销的职责. 3 当不能使用生成子类来扩充时. 模式结构 Component 外部接口,用于定义外部调用的形式.提供默认的处理方法. interface Component{ public void operation(); }   ConcreteComponent  具体的处理类,用于实现operation

设计模式:装饰模式(Decorator)

 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式想必生成子类更为灵活.  装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式中的角色有: 1. 抽象构件角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象. 2. 具体构件角色(ConcreteComponent):定义一个将要接收附加责任的类. 3. 装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与

大话设计模式之装饰模式

          装饰,字面意思是对生活用品或生活环境进行艺术加工的手法.它必须与所装饰的客体有机地结合,成为统一.和谐的整体,以便丰富艺术形象,扩大艺术表现力,加强审美效果,并提高其功能.经济价值和社会效益.我们编程世界中的装饰又有着怎样与众不同的解释呢?原来装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.         我们来看一个具体的例子,经过一个上午的消耗,加上昨天晚上熬夜看<出彩中国人>,早上赖床,

C++设计模式之装饰模式_C 语言

前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 1.将这些非核心的操作全部放到类中,这样,一个类就包含了很多核心的操作和一些看似有关,但是又无关的操作:这就会使核心类发生"爆炸"的现象,从而使核心类失去了一定的价值,也使使用核心类的客户在核心操作和非核心操作中挣扎: 2.使用继承来扩展核心类,需要使用核心类时,直接建立核心类对象:当需要使用

温故而知新:设计模式之装饰模式(Decorator)

小时候对日本的动画片十分着迷,"圣斗士"是我的最爱:长大后也曾经一度对"海贼王"十分痴迷:大学看武侠小说时,也特别喜欢那种主人公有奇遇的情况:吃到一颗千年异果,然后功夫大增60年... 这些个场景都有一个共同点:对象(或系统)会因为一些需求(通常这些需求之间没有任何关联),而扩展自己的功能.具体来说:青铜战士如果有幸能穿上黄金圣衣,不管你是不是黄金圣斗士,在穿上黄金圣衣的那一刻,你就具有黄金圣斗士的能力:海赋王中的人物,如果能吃到一颗奇异果,就能获得特别的能力(比如

php设计模式 Decorator(装饰模式)

复制代码 代码如下: <?php /** * 装饰模式 * * 动态的给一个对象添加一些额外的职责,就扩展功能而言比生成子类方式更为灵活 */ header("Content-type:text/html;charset=utf-8"); abstract class MessageBoardHandler { public function __construct(){} abstract public function filter($msg); } class Messag

PHP设计模式之装饰模式

下面是一个简单类,帮助了解装饰模式,希望能对大家有帮助,有些地方改成中文,便于了解. 我要到饭馆吃饭,程序的结果是打印对我吃的东西的描述和计算价钱. 这样一层一层的包下来, 像是大口袋套小口袋,就是所谓的装饰模式. //基类 class 食物{ var $des='食物'; var $cost; function getdes(){ return $this->des; } function getcost(){ return $this->cost; } } //被装饰者类 class 米饭

设计模式之装饰模式

          装饰模式,动态的给一个对象添加一些额外的职责,就增加功能而言,装饰模式比生成子类更为灵活.这种模式可以有效的将类的核心职责和装饰功能区分开来.         设计原则:          1.多用组合,少用继承             利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展.            2.类的设计应对扩展开放,对修改关闭.          要点