1、装饰(Decorator)模式
    动态给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。
Component是定义一个对象接口、可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
2、结构图
  
Component 类:
    abstract class Component
    {
        public abstract void Operation();
    }
ConcreteComponent类:
    class ConcreteComponent : Component
    {
        public voerride void Operation()
        {
            Console.WriteLine("具体对象的操作");
        }
    }
Decorator类:
abstract class Decorator:Component
{
    protected Component component;
    public void SetComponent(Component component)//设置Component
    {
        this.component = component;
    }
    public voerride void Operation()
    {
        if(component != null)
        {
            component.Operation();
        }
    }
}
ConcreteDecoratorA 类:
class ConcreteDecoratorA : Decorator
{
    private string addedState;//本类的独有功能,以区别于ConcreteDecoratorB
    public voerride void Operation()
    {
        base.Operation();
        addedState = "New State";
        Console.WriteLine("具体装饰对象A的操作");
    }
}
ConcreteDecoratorB 类:
class ConcreteDecoratorB : Decorator
{
    private string addedState;//本类的独有功能,以区别于ConcreteDecoratorB
    public voerride void Operation()
    {
        base.Operation();//首先运行原Component的Operation(),再执行本类的功能,如AddedBehavior(),相当于对原Component进行了装饰
        addedBehavior();
        Console.WriteLine("具体装饰对象B的操作");
    }
    
    private void addedBehavior()//本类独有的方法以区别于ConcreteDecoratorA
    {
        
    }
}

客户端代码:
static void Main(string[] args)
{
    ConcreteComponent c = new ConcreteComponent();
    ConcreteDecoratorA da = new ConcreteDecoratorA();
    ConcreteDecoratorB db = new ConcreteDecoratorB();
    da.SetComponent(c);
    db.SetComponent(da);
    db.Operation();
    Console.Read();    
}
      装饰模式是利用SetCompnent来对对象进行包装的,这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
      如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。
3、总结
      装饰模式是为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新添加的代码通常装饰了原有类的核心职责或主要行为,他们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功放在一个单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。
      装饰模式优点是把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。

最新文章

  1. Android Studio导入github下载的project和module
  2. NetFPGA
  3. Support Vector Machine (1) : 简单SVM原理
  4. Javascript是一个事件驱动语言
  5. STM32内存映射
  6. css3圈圈进度条
  7. Everything中文绿色版在Win7/8/10用不了问题的图文教程,只显示盘符
  8. ECLIPSE实现了界面显示所有类
  9. angular : direative : autoResize textarea auto resize
  10. 【JAVAWEB学习笔记】02_HTML&CSS
  11. 对 Servlet 的改进--------Struts2 引入
  12. shell脚本交互:expect学习笔记及实例详解
  13. Error Code: 1054. Unknown column 'age' in 'user'
  14. 活代码LINQ——09
  15. 多个微信小程序一个服务端架构
  16. One-hot encoding 独热编码
  17. 函数:PHP将字符串从GBK转换为UTF8字符集iconv
  18. oracle 窗口函数 (keep)
  19. 3ds max学习笔记(十二)-- (弯曲:实例旋转楼梯)
  20. 根据txt中的文件名将文件复制到目标文件夹中

热门文章

  1. HTML&CSS基础学习笔记1.30-颜色的表达
  2. select查询的性能
  3. css()和 attr()的区别
  4. Android 判断当前设备是手机还是平板
  5. Growing Pains for Deep Learning
  6. javascript note
  7. 三个QT咨询公司以及QT5.0的主要特点
  8. 【转】BLE开发的各种坑
  9. Visual Studio创建跨平台移动应用_02.Cordova Extension
  10. Java并发编程:线程和进程的创建(转)