zoukankan      html  css  js  c++  java
  • Decorator Pattern简单随笔

        
             “装饰模式(Decorator)”又名“包装模式(Wrapper)”,通常用来灵活地扩充对象的功能
              我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。
              装饰模式(Decorator)描述:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
    使用场景:
    1、扩展一个类的功能,或给一个类增加附加功能
    2、动态的给对象增加或删除功能
    3、动态增加一组基本功能,自由组合重复使用这一组功能
    组织结构:
    1、抽象构件:抽象接口,作用是规范准备接收附加功能的对象
    2、具体构件:准备接收附加功能的对象,继承抽象构件
    3、抽象装饰:持有一个具体构件对象的实例,并定义一个与抽象构件一致的接口(也可以继承于抽象构件)
    4、具体装饰:实现附加功能的对象,继承抽象装饰
     
    类关系图如下所示:
     
     
    主要是通过OperaterDecorator这个抽象类 中的对象组合来启动原有的BASE.WORK()方法,其次是执行额外增加的功能。这个对象可以多次被包装,使实现的功能动态的增加(而使用继承的话,子类相应的会大量增加,因此不建议采用继承来解决此类问题);
     
    额外增加的功能类代码如下:
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace DecoratorPatternSam
     6 {
     7     public abstract class OperaterDecorator:Operater 
     8     {
     9         //关键点
    10 
    11         private Operater _operater;
    12         public
     OperaterDecorator(Operater operater) 
    13 
            { 
    14           this._operater=
    operater;
    15 
            }
    16 
          
    17         public override void
     Work()
    18 
            {
    19            // throw new Exception("The method or operation is not implemented.");

    20             this._operater.Work();
    21 
            }
    22     }
    23 }
    24 
    25 using System;
    26 using System.Collections.Generic;
    27 using System.Text;
    28 
    29 namespace DecoratorPatternSam
    30 {
    31     public class OperaterDecoratorA:OperaterDecorator 
    32     {
    33         public OperaterDecoratorA(Operater _operater) base(_operater)
    34         {
    35         
    36         }
    37         public override void Work()
    38         {//关键点
    39             base.Work();//
    40             AddedWorkMethodA();
    41         }
    42 
    43         private void AddedWorkMethodA()
    44         {
    45             //throw new Exception("The method or operation is not implemented.");
    46             Console.WriteLine("execute added work method a");
    47         }
    48     }
    49 }
    50 
    51 

     

    客户端代码通过包装对象实现相应的功能:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Text;
     4 
     5 namespace DecoratorPatternSam
     6 {
     7     class Program
     8     {
     9         static void Main(string[] args)
    10         {
    11             OperaterA a = new OperaterA();
    12             a.Work();
    13             Console.WriteLine("---------------------");
    14             OperaterDecoratorA decoraterA = new OperaterDecoratorA(a);
    15             decoraterA.Work();
    16             Console.WriteLine("---------------------");
    17             OperaterDecoratorB decoraterB = new OperaterDecoratorB(decoraterA);
    18             decoraterB.Work();
    19             Console.WriteLine("---------------------");
    20             decoraterA = new OperaterDecoratorA(decoraterB);
    21             decoraterA.Work();
    22             Console.ReadLine();
    23         }
    24     }
    25 }
    26 
    显示结果如下,将额外的方法增加了进去:
     
    //****************************动态扩充对象的功能
    源代码下载地址:/Files/jasenkin/DecoratorPatternSam.rar
  • 相关阅读:
    Django-ORM
    深入理解vue 修饰符sync
    PS切图
    用Chrome 浏览器调试移动端网页 chrome://inspect/#devices
    float浮动导致父元素高度坍塌的原因及清除浮动方法
    vue keep-alive
    ES6 箭头函数
    ES6 Module(模块)
    MVC模式 和 MVVM模式
    移动端适配代码
  • 原文地址:https://www.cnblogs.com/jasenkin/p/1687472.html
Copyright © 2011-2022 走看看