`
AutomaticThoughts
  • 浏览: 165476 次
社区版块
存档分类
最新评论

设计模式读书笔记之装饰器模式(Decorator) .

 
阅读更多

Decorator装饰器模式就是创建一个新类为某一个类动态添加新功能或增强原有的功能.

特点:
装饰器持有一个被装饰的对象;
装饰器和被装饰的对象有相同的接口;
装饰器给被装饰的对象添加额外的功能或增强已有的功能.
即保持接口, 增强功能. 表现形式上最大的特点是装饰器使用并且实现一个父类.

 

示例代码:

 

  1. //装饰器和被装饰的对象共同的接口   
  2. package designpattern.decorator;  
  3.   
  4. public interface Target {  
  5.     public void operation();  
  6. }  
  7.   
  8. //被装饰的类   
  9. package designpattern.decorator;  
  10.   
  11. public class ConcreteTarget implements Target{  
  12.       
  13.     public void operation() {  
  14.         System.out.println("Original operation.");  
  15.     }  
  16. }  
  17.   
  18. //装饰器1   
  19. package designpattern.decorator;  
  20.   
  21. public class Decorator1 implements Target{  
  22.       
  23.     private Target target;  
  24.       
  25.     public Decorator1(Target t){  
  26.         this.target = t;  
  27.     }  
  28.     public void operation() {  
  29.         System.out.println("Before decorator 1");  
  30.         target.operation();  
  31.         System.out.println("Atfer decorator 1");  
  32.     }  
  33. }  
  34.   
  35. //装饰器2   
  36. package designpattern.decorator;  
  37.   
  38. public class Decorator2 implements Target{  
  39.       
  40.     private Target target;  
  41.       
  42.     public Decorator2(Target t){  
  43.         this.target = t;  
  44.     }  
  45.     public void operation() {  
  46.         System.out.println("Before decorator 2");  
  47.         target.operation();  
  48.         System.out.println("Atfer decorator 2");  
  49.     }  
  50. }  
  51.   
  52. //装饰器3   
  53. package designpattern.decorator;  
  54.   
  55. public class Decorator3 implements Target{  
  56.       
  57.     private Target target;  
  58.       
  59.     public Decorator3(Target t){  
  60.         this.target = t;  
  61.     }  
  62.     public void operation() {  
  63.         System.out.println("Before decorator 3");  
  64.         target.operation();  
  65.         System.out.println("Atfer decorator 3");  
  66.     }  
  67. }  
  68.   
  69. //测试代码   
  70. package designpattern.decorator;  
  71.   
  72. public class Test {  
  73.     public static void main(String[] args){  
  74.         Target t = new ConcreteTarget();  
  75.         Target obj = new Decorator1(new Decorator2(new Decorator3(t)));  
  76.         obj.operation();  
  77.     }  
  78. }  

 

这个例子还是显得有些生硬,结合生活中的例子解剖一下装饰器。

一个士兵(Solider)可以行军(march),开火(fire)。 可以用特种装备来装饰这个兵。如:可以用飞行器装配这个兵,使之可飞行, 可以用侦查装备装饰这个兵, 使之可侦查,夜视装备装饰他,使之可夜视。则FlySoldier, ScoutSoldier, NightVisionSoldier是Soldier的装饰器。 而且这些装饰器可以任意组合。

 

  1. package designpattern.decorator;  
  2. //兵   
  3. public interface Soldier {  
  4.     public String getAbility();  
  5. }  
  6.   
  7. //中国兵   
  8. package designpattern.decorator;  
  9. public class ChineseSoldier implements Soldier{  
  10.     public String getAbility() {  
  11.         return "I am a soldier, I can ";  
  12.     }  
  13. }  
  14.   
  15. //会飞的兵   
  16. package designpattern.decorator;  
  17. public class FlySoldier implements Soldier{  
  18.     private Soldier soldier;  
  19.     public FlySoldier(Soldier s){  
  20.         this.soldier = s;  
  21.     }  
  22.     public String getAbility() {  
  23.         return soldier.getAbility() + "fly ";  
  24.     }  
  25. }  
  26.   
  27.   
  28. //会侦查的兵   
  29. package designpattern.decorator;  
  30. public class ScoutSoldier implements Soldier{  
  31.     private Soldier soldier;  
  32.     public ScoutSoldier(Soldier s){  
  33.         this.soldier = s;  
  34.     }  
  35.     public String getAbility() {  
  36.         return soldier.getAbility() + "scout ";  
  37.     }  
  38. }  
  39.   
  40. //能夜视的兵   
  41. package designpattern.decorator;  
  42. public class NightVisionSoldier implements Soldier{  
  43.     private Soldier soldier;  
  44.     public NightVisionSoldier(Soldier s){  
  45.         this.soldier = s;  
  46.     }  
  47.     public String getAbility() {  
  48.         return soldier.getAbility() + "night vision ";  
  49.     }  
  50. }  
  51.   
  52. //测试用例   
  53. package designpattern.decorator;  
  54. public class Test {  
  55.     public static void main(String[] args){  
  56.         Soldier s = new ChineseSoldier();  
  57.         //通过各种装饰器装备出一个特种兵   
  58.         Soldier sprcialSoldier = new NightVisionSoldier(new FlySoldier(new ScoutSoldier(s)));  
  59.         System.out.println(sprcialSoldier.getAbility());  
  60.     }  
  61. }  

 

通过这个例子进一步分析装饰器的特征:

1 兵不需要知道装备, 而装饰器持有兵,兵是一个简单的兵,而装饰器可以非常复杂, 这是第一个特征;

2 一个兵被装备之后他还是一个兵,即装饰器和被装饰的对象有相同的接口;

3 可以用不同的装备装饰一个兵,这些装备可以随便搭配。

 

再举一例: 很多老的单元楼的自来水龙头都放在外面, 为了怕别人偷水, 都给自家的龙头加一个盒子锁; 有的人会给龙头加长管子一直牵到自家厨房; 那么加锁, 搭管子就是对龙头进行装饰.并且满足3个特征: 1 装饰器(锁, 管子)都持有原来的水龙头,并增强了原来的水龙头的功能;2 加了锁,套了管子的水龙头还是水龙头; 3  这些装饰器可以方便的拆卸, 组合.

 

经典案例:

jdk中io使用Decorator对各种流进行封装.

如 BufferedInputStream bi = new BufferedInputStream(new FileInputStream("1.txt"));BufferedInputStream 对FileInputStream进行装饰;InputStream是他们共有的接口.

BufferedReader br = new BufferedReader(new FileReader("1.txt"));

BufferedReader对FileReader进行装饰, Reader是他们共同的接口.

还有更多...

 

优点:

在拓展类的功能上比继承拥有更大的灵活性

装饰器类可以方便自由的组合

 

缺点:

使用更少的类,但是构造复杂

分享到:
评论

相关推荐

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    设计模式的读书总结笔记

    这篇“设计模式的读书总结笔记”是对设计模式深入理解和应用的结晶,包含对各种模式的实例解析、优缺点分析以及如何在实际项目中应用的指导。 一、设计模式的基本概念 设计模式并不直接提供代码实现,而是描述在...

    JAVA与模式读书笔记。

    在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    软件体系结构与设计模式课堂笔记.docx

    结构型模式如适配器模式(Adapter)、组合模式(Composite)、装饰器模式(Decorator)关注类的组合和结构。行为型模式如命令模式(Command)、观察者模式(Observer)关注对象的行为和通信。这些模式为解决特定问题...

    图解Java设计模式笔记总结word版本.rar

    本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...

    台湾人写的设计模式笔记

    这份由台湾作者编写的笔记,结合Java语言,为读者提供了一种深入理解并应用设计模式的方式。以下是对这些设计模式的详细解释: 1. **创建型模式(Creational Patterns)** 创建型模式关注于对象的创建过程,它们帮助...

    Decorator装饰者模式

    装饰者模式是一种面向对象的设计模式,它允许在运行时向对象添加新的行为或属性,而无需修改对象的原始代码。这种模式是结构型模式的一种,遵循开闭原则,即对扩展开放,对修改关闭。Head First系列的学习笔记是通过...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    HeadFirst设计模式笔记

    《HeadFirst设计模式笔记》是深入理解软件设计思想的一份宝贵资料,主要涵盖了设计模式的基础理论和实际应用。设计模式是软件开发中的经验总结,它为解决常见的编程问题提供了标准的解决方案,使得代码更具可读性、...

    设计模式学习笔记

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。Java中的23种设计模式被广泛接受并应用于各种项目中,它们分为三类:创建型、结构型和行为型模式。 创建型模式关注对象的创建过程...

    设计模式总结笔记设计模式总结笔记

    ### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...

    Java设计模式尚硅谷笔记

    本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...

    Head First 设计模式学习笔记(十四)模式的组合使用

    通过以上分析,我们可以看出这篇学习笔记探讨了如何在实际项目中结合使用多种设计模式,如适配器、组合、观察者、装饰器、代理和状态模式,以提高代码的灵活性、可维护性和复用性。这些模式是面向对象设计的核心组成...

    设计模式笔记

    装饰器模式是一种结构型设计模式,它允许在运行时给对象添加新的行为或职责,而无需改变其原有类。Java中的IO流库广泛使用了装饰器模式,如`BufferedInputStream`和`PrintStream`。 8. **DecoratorPattern.htm** - ...

    设计模式 笔记(附带代码)

    装饰者模式是一种结构型设计模式,允许在运行时给对象添加新的行为或责任。它通过创建一个包装对象,包裹原有对象并扩展其功能,而不是通过继承来修改类。这种方式避免了因为类的层次过多而导致的类爆炸问题。 2. *...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    设计模式(Java 与模式-笔记 二)

    本文主要关注的是Java编程语言中的设计模式,结合“Java与模式-笔记二”的博客内容,我们将深入探讨其中的一些核心设计模式及其在实际开发中的应用。 首先,我们来谈谈单例模式(Singleton)。单例模式确保一个类...

Global site tag (gtag.js) - Google Analytics