SlideShare a Scribd company logo
北京圣思园科技有限公司
http://www.shengsiyuan.com
• 装饰模式又名包装(Wrapper)模式
• 装饰模式以对客户端透明的方式扩展对象
  的功能,是继承关系的一个替代方案
• 装饰模式以对客户透明的方式动态的给一
  个对象附加上更多的责任。换言之,客户
  端并不会觉得对象在装饰前和装饰后有什
  么不同。
• 装饰模式可以在不创造更多子类的情况下,
  将对象的功能加以扩展。
• 装饰模式把客户端的调用委派到被装饰类。
  装饰模式的关键在于这种扩展完全是透明
  的。
• 装饰模式是在不必改变原类文件和使用继
  承的情况下,动态的扩展一个对象的功能。
  它是通过创建一个包装对象,也就是装饰
  来包裹真实的对象。
• 装饰模式的角色:
 – 抽象构件角色(Component):给出一个抽
   象接口,以规范准备接收附加责任的对象。
 – 具体构件角色(Concrete Component):
   定义一个将要接收附加责任的类。
 – 装饰角色(Decorator):持有一个构件
   (Component)对象的引用,并定义一个与
   抽象构件接口一致的接口
 – 具体装饰角色(Concrete Decorator):负
   责给构件对象“贴上”附加的责任。
• 装饰模式的特点:
 – 装饰对象和真实对象有相同的接口。这样客户端对象
   就可以以和真实对象相同的方式和装饰对象交互。
 – 装饰对象包含一个真实对象的引用(reference)
 – 装饰对象接收所有来自客户端的请求。它把这些请求
   转发给真实的对象。
 – 装饰对象可以在转发这些请求以前或以后增加一些附
   加功能。这样就确保了在运行时,不用修改给定对象
   的结构就可以在外部增加附加的功能。在面向对象的
   设计中,通常是通过继承来实现对给定类的功能扩展。
• 装饰模式
 – 用来扩展特定对象的功能
 – 不需要子类
 – 动态
 – 运行时分配职责
 – 防止由于子类而导致的复杂和混乱
 – 更多的灵活性
 – 对于一个给定的对象,同时可能有不同的装饰
   对象,客户端可以通过它的需要选择合适的装
   饰对象发送消息。
• 继承
 – 用来扩展一类对象的功能
 – 需要子类
 – 静态
 – 编译时分派职责
 – 导致很多子类产生
 – 缺乏灵活性
• 实现自己的装饰模式

More Related Content

Viewers also liked

AutoLisp Reference
AutoLisp ReferenceAutoLisp Reference
AutoLisp Reference
Liu Tun
 
[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2ArBing Xie
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用
ArBing Xie
 
Silastial Glass Technology With Photographs
Silastial Glass Technology With PhotographsSilastial Glass Technology With Photographs
Silastial Glass Technology With Photographsricksilas
 
[圣思园][Java SE]Contest shengsiyuan
[圣思园][Java SE]Contest shengsiyuan[圣思园][Java SE]Contest shengsiyuan
[圣思园][Java SE]Contest shengsiyuanArBing Xie
 
Människans historia
Människans historiaMänniskans historia
Människans historiaelisabeth
 
Usa blir en stormakt
Usa blir en stormaktUsa blir en stormakt
Usa blir en stormaktelisabeth
 
Presentación clase 2 e-learning class
Presentación  clase 2 e-learning classPresentación  clase 2 e-learning class
Presentación clase 2 e-learning classSergio Silvio Falasco
 

Viewers also liked (10)

AutoLisp Reference
AutoLisp ReferenceAutoLisp Reference
AutoLisp Reference
 
[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2[圣思园][Java SE]Ooad与uml lesson 2
[圣思园][Java SE]Ooad与uml lesson 2
 
沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用沈阳师范大学课程实践 Android开发应用
沈阳师范大学课程实践 Android开发应用
 
Presentación1 tecno
Presentación1 tecnoPresentación1 tecno
Presentación1 tecno
 
Silastial Glass Technology With Photographs
Silastial Glass Technology With PhotographsSilastial Glass Technology With Photographs
Silastial Glass Technology With Photographs
 
[圣思园][Java SE]Contest shengsiyuan
[圣思园][Java SE]Contest shengsiyuan[圣思园][Java SE]Contest shengsiyuan
[圣思园][Java SE]Contest shengsiyuan
 
Människans historia
Människans historiaMänniskans historia
Människans historia
 
Usa blir en stormakt
Usa blir en stormaktUsa blir en stormakt
Usa blir en stormakt
 
Usa klimat
Usa klimatUsa klimat
Usa klimat
 
Presentación clase 2 e-learning class
Presentación  clase 2 e-learning classPresentación  clase 2 e-learning class
Presentación clase 2 e-learning class
 

More from ArBing Xie

[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3ArBing Xie
 
[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15ArBing Xie
 
[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy[圣思园][Java SE]Strategy
[圣思园][Java SE]StrategyArBing Xie
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]ReflectionArBing Xie
 
[圣思园][Java SE]Observer
[圣思园][Java SE]Observer[圣思园][Java SE]Observer
[圣思园][Java SE]ObserverArBing Xie
 
[圣思园][Java SE]Network
[圣思园][Java SE]Network[圣思园][Java SE]Network
[圣思园][Java SE]NetworkArBing Xie
 
[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5ArBing Xie
 
[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22ArBing Xie
 
[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21ArBing Xie
 
[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20ArBing Xie
 
[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17ArBing Xie
 
[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16ArBing Xie
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13ArBing Xie
 
[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12ArBing Xie
 
[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11ArBing Xie
 
[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10ArBing Xie
 
[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9ArBing Xie
 
[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8ArBing Xie
 
[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5ArBing Xie
 
[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4ArBing Xie
 

More from ArBing Xie (20)

[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3[圣思园][Java SE]Java se lesson 3
[圣思园][Java SE]Java se lesson 3
 
[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15[圣思园][Java SE]Java se lesson 15
[圣思园][Java SE]Java se lesson 15
 
[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy[圣思园][Java SE]Strategy
[圣思园][Java SE]Strategy
 
[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection[圣思园][Java SE]Reflection
[圣思园][Java SE]Reflection
 
[圣思园][Java SE]Observer
[圣思园][Java SE]Observer[圣思园][Java SE]Observer
[圣思园][Java SE]Observer
 
[圣思园][Java SE]Network
[圣思园][Java SE]Network[圣思园][Java SE]Network
[圣思园][Java SE]Network
 
[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5[圣思园][Java SE]Jdk5
[圣思园][Java SE]Jdk5
 
[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22[圣思园][Java SE]Java se lesson 22
[圣思园][Java SE]Java se lesson 22
 
[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21[圣思园][Java SE]Java se lesson 21
[圣思园][Java SE]Java se lesson 21
 
[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20[圣思园][Java SE]Java se lesson 20
[圣思园][Java SE]Java se lesson 20
 
[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17[圣思园][Java SE]Java se lesson 17
[圣思园][Java SE]Java se lesson 17
 
[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16[圣思园][Java SE]Java se lesson 16
[圣思园][Java SE]Java se lesson 16
 
[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13[圣思园][Java SE]Java se lesson 13
[圣思园][Java SE]Java se lesson 13
 
[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12[圣思园][Java SE]Java se lesson 12
[圣思园][Java SE]Java se lesson 12
 
[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11[圣思园][Java SE]Java se lesson 11
[圣思园][Java SE]Java se lesson 11
 
[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10[圣思园][Java SE]Java se lesson 10
[圣思园][Java SE]Java se lesson 10
 
[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9[圣思园][Java SE]Java se lesson 9
[圣思园][Java SE]Java se lesson 9
 
[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8[圣思园][Java SE]Java se lesson 8
[圣思园][Java SE]Java se lesson 8
 
[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5[圣思园][Java SE]Java se lesson 5
[圣思园][Java SE]Java se lesson 5
 
[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4[圣思园][Java SE]Java se lesson 4
[圣思园][Java SE]Java se lesson 4
 

[圣思园][Java SE]Decorator

  • 2. • 装饰模式又名包装(Wrapper)模式 • 装饰模式以对客户端透明的方式扩展对象 的功能,是继承关系的一个替代方案 • 装饰模式以对客户透明的方式动态的给一 个对象附加上更多的责任。换言之,客户 端并不会觉得对象在装饰前和装饰后有什 么不同。 • 装饰模式可以在不创造更多子类的情况下, 将对象的功能加以扩展。
  • 3. • 装饰模式把客户端的调用委派到被装饰类。 装饰模式的关键在于这种扩展完全是透明 的。 • 装饰模式是在不必改变原类文件和使用继 承的情况下,动态的扩展一个对象的功能。 它是通过创建一个包装对象,也就是装饰 来包裹真实的对象。
  • 4. • 装饰模式的角色: – 抽象构件角色(Component):给出一个抽 象接口,以规范准备接收附加责任的对象。 – 具体构件角色(Concrete Component): 定义一个将要接收附加责任的类。 – 装饰角色(Decorator):持有一个构件 (Component)对象的引用,并定义一个与 抽象构件接口一致的接口 – 具体装饰角色(Concrete Decorator):负 责给构件对象“贴上”附加的责任。
  • 5. • 装饰模式的特点: – 装饰对象和真实对象有相同的接口。这样客户端对象 就可以以和真实对象相同的方式和装饰对象交互。 – 装饰对象包含一个真实对象的引用(reference) – 装饰对象接收所有来自客户端的请求。它把这些请求 转发给真实的对象。 – 装饰对象可以在转发这些请求以前或以后增加一些附 加功能。这样就确保了在运行时,不用修改给定对象 的结构就可以在外部增加附加的功能。在面向对象的 设计中,通常是通过继承来实现对给定类的功能扩展。
  • 6. • 装饰模式 – 用来扩展特定对象的功能 – 不需要子类 – 动态 – 运行时分配职责 – 防止由于子类而导致的复杂和混乱 – 更多的灵活性 – 对于一个给定的对象,同时可能有不同的装饰 对象,客户端可以通过它的需要选择合适的装 饰对象发送消息。
  • 7. • 继承 – 用来扩展一类对象的功能 – 需要子类 – 静态 – 编译时分派职责 – 导致很多子类产生 – 缺乏灵活性