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

简介: 原文:设计模式之六(装饰模式)前言 装饰模式:动态の给一个对象添加有些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式结构图   Component是定义一个对象接口,可以给这些对象动态添加职责 ConcreteComponent是定义了一个具体的对象,也可以给这个对象...
原文: 设计模式之六(装饰模式)

前言

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

装饰模式结构图

 

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的责任合并成一个类。

总结

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

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

 

目录
相关文章
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
160 0
|
设计模式 中间件 PHP
设计模式 | 装饰模式
设计模式 | 装饰模式
193 0
|
设计模式
设计模式系列教程(12) - 装饰模式
设计模式系列教程(12) - 装饰模式
170 0
|
设计模式 算法 uml
结构型设计模式01-装饰模式
结构型设计模式01-装饰模式
203 0
|
设计模式
设计模式13 - 装饰模式【Decorator Pattern】
设计模式13 - 装饰模式【Decorator Pattern】
212 0
|
设计模式
设计模式——装饰模式
设计模式——装饰模式
230 0
|
设计模式 Java
【八】设计模式~~~结构型模式~~~装饰模式(Java)
文章详细介绍了装饰模式(Decorator Pattern),这是一种对象结构型模式,用于在不使用继承的情况下动态地给对象添加额外的职责。装饰模式通过关联机制,使用装饰器类来包装原有对象,并在运行时通过组合的方式扩展对象的行为。文章通过图形界面构件库的设计案例,展示了装饰模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和应用示例。装饰模式提高了系统的灵活性和可扩展性,适用于需要动态、透明地扩展对象功能的情况。
【八】设计模式~~~结构型模式~~~装饰模式(Java)
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
240 1
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
164 1
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式

热门文章

最新文章