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

举例:假设我们要开发一个照相管用的程序
|
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. 类应设计的对扩展开放,对修改关闭
第8章 装饰模式(Decorator Pattern)的更多相关文章
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...
- 设计模式-装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 装饰模式(Decorator pattern)
装饰模式(Decorator pattern): 又名包装模式(Wrapper pattern), 它以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式以对客户透明的方式动态的给 ...
- 设计模式系列之装饰模式(Decorator Pattern)
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原 ...
- 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- 装饰模式Decorator Pattern
1.主要优点 装饰模式的主要优点如下: (1) 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加. (3) 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类 ...
- 设计模式——装饰模式(Decorator Pattern)
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. UML图: 模型类: Component类: package com.cnblog.clarck; /** ...
随机推荐
- Linux在简短而经常使用的命令
Linux组成: 内核:的心脏.是执行程序和管理像磁盘和打印机等硬件设备的核心程序. shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.是 ...
- 《Java程序书面采访猿收藏》之 instanceof的作用是什么
instanceof它是Java二元运算语言,它的作用是推断对象变量引用被指向的类型是一类(或接口.抽象类.父亲)示例.即,对象是否是它的一个实例离开它的类的权.返回boolean数据类型. 常见的使 ...
- Sql Server远程查询db 表中的数据,以本地
step 1: sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queri ...
- not accessible due to restriction on required library
The type AWTUtilities is not accessible due to restriction on required library D:\Program Files\jdk1 ...
- 基本介绍LINUX远程PC软件:PUTTY、SecureCRT、X-Manager
***********************************************声明************************************************ 原创 ...
- HDU 4433 locker 2012 Asia Tianjin Regional Contest 减少国家DP
意甲冠军:给定的长度可达1000数的顺序,图像password像锁.可以上下滑动,同时会0-9周期. 每个操作.最多三个数字连续操作.现在给出的起始序列和靶序列,获得操作的最小数量,从起始序列与靶序列 ...
- POJ 1915 Knight Moves(BFS+STL)
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20913 Accepted: 9702 ...
- ef添加字段
先在实体类里添加字段 ,然后执行 Add-Migration updateNumberOfLikes Update-Database -Verbose
- oracle查看经常使用的系统信息
总结了查看oracle数据库的经常使用sql ,有助于分析优化出一个健壮的系统程序来. 1.当前的数据库连接数: select count(*) from v$process 2.数据库同意的最大连接 ...
- Maven本地仓库配置
一. 为什么配置? 默认情况下,maven的本地仓库在C盘下用户文件夹: .m2/repository.全部的maven构件(artifact)都被存储到该仓库中.以方便重用. 可是放在C盘一个是占用 ...