装饰器模式

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace DesignPattern.StructuralPattern
  8 {
  9     #region 装饰器模式要点
 10     //定义:以对客户透明的方式动态的为对象附加更多责任,装饰器相比子类可以更加灵活地增加新功能。
 11     //1.使用组合而不是继承,更灵活,装饰器类都含有被装饰类的引用
 12     //2.装饰器抽象类和被装饰类继承相同类或实现相同接口,为了使被装饰类和装饰类能够互换
 13     //3.可以通过不同的装饰顺序,实现不同的行为的组合
 14     //示例:Stream就使用了装饰器模式
 15     //可以动态的为MemoryStream,FileStream,NetworkStream增加新的功能加密流,缓存流,压缩流等,都继承stream
 16 
 17     /*    
 18             MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99});
 19 
 20             // 扩展缓冲的功能
 21             BufferedStream buffStream = new BufferedStream(memoryStream);
 22 
 23             // 添加加密的功能
 24             CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write);
 25 
 26             // 添加压缩功能
 27             GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);
 28      */
 29 
 30     #endregion
 31 
 32     //接口或者抽象类
 33 
 34     public abstract class AbstractPrint
 35     {
 36         public abstract void Print();
 37     }
 38 
 39     //被装饰类
 40     public class Printer : AbstractPrint
 41     {
 42         public override void Print()
 43         {
 44             Console.WriteLine("打印机开始打印");
 45         }
 46     }
 47 
 48     public abstract class DecoratorPattern : AbstractPrint
 49     {
 50         Printer _printer = null;
 51         public Printer MyPrinter
 52         {
 53             get { return _printer; }
 54             set { _printer = value; } 
 55         }
 56 
 57         public DecoratorPattern(Printer printer) 
 58         {
 59             _printer = printer;
 60         }
 61 
 62 
 63 
 64         public override void Print()
 65         {
 66             if (_printer != null)
 67             {
 68                 _printer.Print();
 69             }
 70         }
 71     }
 72 
 73     public class ConcreteDecoratorInk : DecoratorPattern
 74     {
 75         public ConcreteDecoratorInk(Printer printer) :base(printer)
 76         {
 77                    
 78         }
 79 
 80         //重写可以自己调整新增方法顺序
 81         public override void Print()
 82         {
 83             DecoratorMethod();
 84             base.Print();
 85         }
 86 
 87         public void DecoratorMethod()
 88         {
 89             Console.WriteLine("添加彩色油墨");
 90         }
 91     }
 92 
 93 
 94     public class ConcreteDecoratorPapper : DecoratorPattern
 95     {
 96         public ConcreteDecoratorPapper(Printer printer) : base(printer)
 97         {
 98 
 99         }
100 
101         //重写可以自己调整新增方法顺序
102         public override void Print()
103         {
104             base.Print();
105             DecoratorMethod();
106         }
107 
108         public void DecoratorMethod()
109         {
110             Console.WriteLine("添加A4纸");
111         }
112     }
113 }

 

装饰器模式

上一篇:Gradle编译报错, 前言中不允许有内容。


下一篇:第一节:库的管理