C#设计模式之八装饰模式(Decorator Pattern)【结构型】
一、引言 2.4、模式的组成 ??? 在装饰模式中的各个角色有: (1)、抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。 (2)、具体构件角色(Concrete Component):定义一个将要接收附加责任的类。 (3)、装饰角色(Decorator):持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。 (4)、具体装饰角色(Concrete Decorator):负责给构件对象添加上附加的责任。 2.5 、装饰模式的具体代码实现 ?? 刚开始一看这个“装饰模式”是有点不太好理解,既然这个模式是面向对象的设计模式,那在现实生活中一定有事例和其对应,其实这种例子也不少,大家好好的挖掘吧,也可以提高我们对面向对象的理解。我继续拿盖房子来说事吧。 ? 1 namespace 装饰模式的实现 2 { 3 /// <summary> 4 /// 该抽象类就是房子抽象接口的定义,该类型就相当于是Component类型,是饺子馅,需要装饰的,需要包装的 5 </summary> 6 public abstract class House 7 { 8 //房子的装修方法--该操作相当于Component类型的Operation方法 9 void Renovation(); 10 } 11 12 13 该抽象类就是装饰接口的定义,该类型就相当于是Decorator类型,如果需要具体的功能,可以子类化该类型 14 15 class DecorationStrategy:House 关键点之二,体现关系为Is-a,有这这个关系,装饰的类也可以继续装饰了 16 17 通过组合方式引用Decorator类型,该类型实施具体功能的增加 18 这是关键点之一,包含关系,体现为Has-a 19 protected House _house; 20 21 通过构造器注入,初始化平台实现 22 DecorationStrategy(House house) 23 { 24 this._house=house; 25 } 26 27 该方法就相当于Decorator类型的Operation方法 28 override Renovation() 29 { 30 if(this._house!=null) 31 { 32 this._house.Renovation(); 33 } 34 35 36 37 38 PatrickLiu的房子,我要按我的要求做房子,相当于ConcreteComponent类型,这就是我们具体的饺子馅,我个人比较喜欢韭菜馅 39 40 sealed PatrickLiuHouse:House 41 42 43 44 Console.WriteLine("装修PatrickLiu的房子"); 45 46 47 48 49 50 具有安全功能的设备,可以提供监视和报警功能,相当于ConcreteDecoratorA类型 51 52 HouseSecurityDecorator:DecorationStrategy 53 54 public HouseSecurityDecorator(House house):base(house){} 55 56 57 58 .Renovation(); 59 Console.WriteLine("增加安全系统60 61 62 63 64 具有保温接口的材料,提供保温功能,相当于ConcreteDecoratorB类型 65 66 KeepWarmDecorator:DecorationStrategy 67 68 public KeepWarmDecorator(House house):69 70 71 72 73 Console.WriteLine(增加保温的功能74 75 76 77 Program 78 { 79 static Main() 80 { 81 这就是我们的饺子馅,需要装饰的房子 82 House myselfHouse=new PatrickLiuHouse(); 83 84 DecorationStrategy securityHouse= HouseSecurityDecorator(myselfHouse); 85 securityHouse.Renovation(); 86 房子就有了安全系统了 87 88 如果我既要安全系统又要保暖呢,继续装饰就行 89 DecorationStrategy securityAndWarmHouse= HouseSecurityDecorator(securityHouse); 90 securityAndWarmHouse.Renovation(); 91 } 92 } 93 }
?? 如图: ??? Stream就相当于Component,定义装饰的对象,FileStream就是要装饰的对象,BufferedStream是装饰对象。我们看看BufferedStream的定义,部分定义了。 1 BufferedStream : Stream 2 3 private const int _DefaultBufferSize = 4096; 4 5 private Stream _stream; ?结构很简单,对比结构图看吧,没什么可说的了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |