在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java设计模式系列之装饰者模式

2016-8-29 13:09| 发布者: zhangjf| 查看: 671| 评论: 0

摘要: 何为装饰者模式 (Decorator)? 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。 一、结构 Component : 定义一个对象接口,可以给这些对象动态地添加职责。 interface ...

何为装饰者模式 (Decorator)?
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。
一、结构

Component : 定义一个对象接口,可以给这些对象动态地添加职责。

  1. interface Component {
  2. public void operation();
  3. }
  4. ConcreteComponent : 实现 Component 定义的接口。
  5. class ConcreteComponent implements Component {
  6. @Override
  7. public void operation() {
  8. System.out.println("初始行为");
  9. }
  10. }
复制代码

Decorator : 装饰抽象类,继承了 Component, 从外类来扩展 Component 类的功能,但对于 Component 来说,是无需知道 Decorator 的存在的。

  1. class Decorator implements Component {
  2. // 持有一个 Component 对象,和 Component 形成聚合关系
  3. protected Component component;
  4. // 传入要进一步修饰的对象
  5. public Decorator(Component component) {
  6. this.component = component;
  7. }
  8. @Override
  9. // 调用要修饰对象的原方法
  10. public void operation() {
  11. component.operation();
  12. }
  13. }
复制代码

ConcreteDecorator : 具体的装饰对象,起到给 Component 添加职责的功能。

  1. class ConcreteDecoratorA extends Decorator {
  2. private String addedState = "新属性1";
  3. public ConcreteDecoratorA(Component component) {
  4. super(component);
  5. }
  6. public void operation() {
  7. super.operation();
  8. System.out.println("添加属性: " + addedState);
  9. }
  10. }
  11. class ConcreteDecoratorB extends Decorator {
  12. public ConcreteDecoratorB(Component component) {
  13. super(component);
  14. }
  15. public void operation() {
  16. super.operation();
  17. AddedBehavior();
  18. }
  19. public void AddedBehavior() {
  20. System.out.println("添加行为");
  21. }
  22. }
复制代码

测试代码

  1. public class DecoratorPattern {
  2. public static void main(String[] args) {
  3. Component component = new ConcreteComponent();
  4. component.operation();
  5. System.out.println("======================================");
  6. Decorator decoratorA = new ConcreteDecoratorA(component);
  7. decoratorA.operation();
  8. System.out.println("======================================");
  9. Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
  10. decoratorB.operation();
  11. }
  12. }
复制代码

运行结果

  1. 初始行为
  2. ======================================
  3. 初始行为
  4. 添加属性: 新属性1
  5. ======================================
  6. 初始行为
  7. 添加属性: 新属性1
  8. 添加行为
复制代码

二、应用场景

1、需要动态的、透明的为一个对象添加职责,即不影响其他对象。
2、需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

三、要点

1、装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。

2、装饰对象包含一个真实对象的引用(reference)。

3、装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。

4、装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

以上就是关于java装饰者模式的相关内容介绍,希望对大家的学习有所帮助。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-3 16:44

Copyright 2015-2025 djqfx

返回顶部