.net设计模式之装饰模式
概述:
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点:
结构图:

举例:假设我们要开发一个照相管用的程序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//照相 public abstract class Picture { public abstract void Draw(); } //绘制一个照片 public class People : Picture { public override void Draw() { Console.WriteLine("照一张相片"); } } |
假设我们不仅只照相,而且为了满足客户的需要有的时候需要给相片增加一个相框
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public interface PhotoFrame { void SetFrame(); } public class PeopleWithFram :People, PhotoFrame { public override void Draw() { base.Draw(); //照完加相框 SetFrame(); } public void SetFrame() { //给相片加相框方法 } } |
好 需求又来了,毕竟有钱人还是很多了嘛,不仅要相框,还需要打蜡上保护膜
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public interface ProtectPic { void ProtectImage(); } public class PeopleWithFramWithProtect : People, PhotoFrame, ProtectPic { public override void Draw() { base.Draw(); //先上保护膜打上蜡 ProtectImage(); //在上相框 SetFrame(); } public void SetFrame() { //给相片加相框方法 } public void ProtectImage() { //给相片打蜡上保护膜 } } |
/好,这个时候需求又来了,毕竟不是人人都那么完美,毕竟有丑姑娘嘛,需要PS处理一下,那我们是不是又得定义一个PS接口,然后写个子类去继承呢?“子类复子类,子类何其多”。这种接口继承的方式虽然是解决问题,同时也带来了一系列新的问题,子类可能需要多重继承,这个在某些情况下违反了类的单一职责。后续如来来新的需求子类会变的非常庞大。
我们看看装饰是怎么解决这个问题的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
public class Decorate : Picture { public Picture picture; public Decorate(Picture pic) { this.picture=pic; } public override void Draw() { Console.WriteLine("照一张相片"); } } //相框 public class WithFram : Decorate { public WithFram(Picture pic):base(pic) { } public override void Draw() { SetFrame(); base.Draw(); } public void SetFrame() { //给相片加相框方法 } } //打蜡上保护膜 public class WithProtect : Decorate { public WithProtect(Picture pic) : base(pic) { } public override void Draw() { ProtectImage(); base.Draw(); } public void ProtectImage() { //给相片打蜡上保护膜 } } class Program { static void Main(string[] args) { //照相 Picture pic = new People(); pic.Draw(); //照完像上蜡上保护膜 Picture picProtect = new People(); Decorate dec = new WithProtect(pic); dec.Draw(); //照完上蜡上保护膜上相框 Picture picProtectFrame = new People(); Decorate decProtect = new WithProtect(picProtectFrame); Decorate frame = new WithFram(decProtect);//Decorator模式的精妙所在 frame.Draw(); } } |
用装饰模式,大大减少了子类的继承,并且在调用的时候,可以对上级对象进行再次封装,这个也是Decorator模式非常经典的一个地方!
适用性:
优点:
缺点:
设计原则:
2. 类应设计的对扩展开放,对修改关闭
你的推荐是我最大的动力!
.net设计模式之装饰模式的更多相关文章
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...
- java设计模式之装饰模式
发现设计模式的学习越来越让自己学习的东西太少了,应该多接触一些东西,多出去走一走. 装饰模式概念: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活(大话设计模式) 在不 ...
- 【GOF23设计模式】装饰模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_装饰模式.IO流底层架构.装饰和桥接模式的区别 package com.test.decorator; /** * Com ...
- Java——设计模式(装饰模式_IO)
/* * 装饰设计模式: * 对一组对象的功能进行增强时,就可以使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点: 就是进行功能的扩转增强. * */ public class ...
- Java IO设计模式(装饰模式与适配器模式)
01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...
- 【Unity与23种设计模式】装饰模式(Decorator)
GoF中定义: "动态地附加额外的责任给一个对象.装饰模式提供了一个灵活的选择,让子类可以用来扩展功能." 装饰模式一般用来增加新功能 它可以避免更改已经实现的程序代码 从而增加系 ...
- C 设计模式:装饰模式
最近在公司分享了下C语言版的设计模式,记录一下吧. 参考:<设计模式之禅>中“装饰模式”章节. 上面书中是用C++来实现的,我使用了书中的例子,改用C语言来实现. 一.基础知识 面向对象最 ...
- 从零开始单排学设计模式「装饰模式」黑铁 I
阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...
- 设计模式之装饰模式,session共享的底层原理
前言 还记得当初写spring-session实现分布式集群session的共享的时候,里面有说到利用filter和HttpServletRequestWrapper可以定制自己的getSession ...
随机推荐
- 制作service服务,shell脚本小例子(来自网络)
事先准备工作:源码安装apache .安装目录为/usr/local/httpd 任务需求:1.可通过 service httpd start|stop|status|restart 命令对服务进行控 ...
- ZeroMQ注意事项
Request-Reply状态 供client它必须是严肃的格在根据第一呼叫zmq_send() 函数,然后调用zmq_recv()函数的顺序来运行 对于server来说,运行时序相反 假设不依照这个 ...
- Vs2010 配置驱动的开发环境
我已被用来VS2010开发环境,之前曾经与vs2010驱动的开发环境.重装系统,一次又一次的配置,找了好几篇文章,配置没有成功,在配置阶段突然成功了,直接把原来的驱动程序的配置文件将能够接管使用. 当 ...
- LR杂记 - loadrunner各项指标结果分析
Transactions (用户事务分析) 用户事务分析是站在用户角度进行的基础性能分析. 1 . Transation Sunmmary (事务综述) 对事务进行综合分析是性能分析的第一步,通过分析 ...
- uml学习书籍
uml真正实用的书5这是足够.学习如以下的处理: <UML distilled><--><UML和模式应用>-><UML用户指南> 附加两本&l ...
- RH253读书笔记(3)-Lab 3 Securing Networking
Lab 3 Securing Networking Goal: To build skills with the Netfilter packet filter Sequence 1: Applyin ...
- ORACLE 创建表空间、用户、授权
1.创建表空间 create tablespace TEST logging datafile 'e:\app\administrator\oradata\orcl\TEST.dbf' size 1 ...
- UVa 10190 - Divide, But Not Quite Conquer!
称号:给你第一个任期的等比数列和倒数公比,最后一个条目假定1这一系列的输出,否则输出Boring!. 分析:数学.递减的.所以公比的倒数一定要大于1.即m > 1. 然后在附加一个条件n &g ...
- ubuntu安装jdk eclipse mysql等
linux ubuntu下安装java web开发环境,需要安装包: jdk7 eclipse(选择java EE developer) apche-tomcat mysql(workbench可视化 ...
- 如何在SSIS的脚本组件中访问变量
原文:如何在SSIS的脚本组件中访问变量 这是一个小问题,我们在SSIS的设计中很多地方都会用到变量,我习惯性地将"变量"和"表达式"称为SSIS的灵魂,虽然不 ...