• 装饰模式(Decorator)


    重点概念

    1. 把所需的功能按正确的顺序串联起来进行控制。

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

    3. 感觉和策略模式很像,但是条件设置方法放在父类的公共方法中被继承,区别装饰模式的重点在于“扩展”两个字,扩展原有功能,而不是动态的选择功能。

    2009-11-30_165247

    4. 装饰模式是利用“装饰者类”中的SetComponent 来设置被扩展对象的。这样装饰对象就和扩展对象,通过Base的调用关联在了一起,每个装饰对象只关心自己的功能,然后调用父类中的方法,以调用原有功能即可。

    5.他的可以一层一层的设置,由内到外的设置,每个装饰者都可以设置为装饰者的一个操作。

    image

    6.装饰模式在父类中封装了一个同方法操作,同时提供了一个公共的设置扩展的方法,用于动态设置想要扩展的操作。用户的感觉就是,传递被扩展的对象,并添加了新的扩展方法,在这个设置的类的方法中(同名方法)。

    7. 装饰模式是为已有功能动态地添加更多功能的一种方式。在原有的设计中,当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加入的代码通常修改了原有类的核心职责或主要行为。

    8. 比如在一个原有的类中如果想扩展一些新的功能,可以使用装饰模式,扩展一个子类来重写被扩展类(父类)的方法,在自己的方法里面调用父类方法的同时,写入自己新的方法功能,以扩展原有类中的方法的功能。而被扩展的类,可以通过在扩展类的父类(也就是装饰者类)中开放一个方法,来设置扩展的对象,具体方法就是定义一个Decorator抽象类,将被装饰的类封装起来,用子类来进行扩展

    image

    9. 把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效的把类的核心职责和装饰功能分开了,而且可以去除相关类中重复的装饰逻辑。

    基本示例

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace 装饰模式
    {
        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.Read();
            }
        }
    
        abstract class Component
        {
            public abstract void Operation();
        }
    
        class ConcreteComponent : Component
        {
            public override void Operation()
            {
                Console.WriteLine("具体对象的操作");
            }
        }
    
        abstract class Decorator : Component
        {
            protected Component component;
    
            public void SetComponent(Component component)
            {
                this.component = component;
            }
    
            public override void Operation()
            {
                if (component != null)
                {
                    component.Operation();
                }
            }
        }
    
        class ConcreteDecoratorA : Decorator
        {
            private string addedState;
    
            public override void Operation()
            {
                base.Operation();
                addedState = "New State";
                Console.WriteLine("具体装饰对象A的操作");
            }
        }
    
        class ConcreteDecoratorB : Decorator
        {
    
            public override void Operation()
            {
                base.Operation();
                AddedBehavior();
                Console.WriteLine("具体装饰对象B的操作");
            }
    
            private void AddedBehavior()
            {
    
            }
        }
    }
    冯瑞涛
  • 相关阅读:
    python之集合(set)
    python之字典
    python之列表
    随笔
    JS实现颜色值格式转换 rgb和十六进制的转换
    20211025一周的计划
    密码肯定没错,但是你死活登录不了,登录页面检查密码格式不对,无法执行登录的一种解决方法
    安卓mbn文件丢失,无法搜索移动信号,工程模式mbn乱改,不用QPST烧录怎样恢复?超简单!
    安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
    “500 oops socket” Debian 9 running via Linux Deploy上成功部署vsftpd的解决方案(201901原创)【成功完美简单极致】
  • 原文地址:https://www.cnblogs.com/finehappy/p/1613974.html
Copyright © 2020-2023  润新知