Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式。

一、定义:

Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:

它必须具有一个装饰的对象。

它必须拥有与被装饰对象相同的接口。

它可以给被装饰对象添加额外的功能。

用一句话总结就是:保持接口,增强性能。

装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。

相同点:都拥有一个目标对象。

不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。

二、 典型的装饰器模式的图:

三、相关实例:

1、 Sourcable接口定义了一个方法operation()。

Java代码

package pattern.decorator;

public interface Sourcable {

public void operation();

}

2、Source.java是Sourcable.java的一个实现,operation()方法的实现就是简单的负责往控制台输出一个字符串:

Java代码

package pattern.decorator;

public class Source implements Sourcable {

public void operation() {

System.out.println("原始类的方法");

}

}

3、装饰器类Decorator1.java采用了典型的对象适配器模式,它首先拥有一个Sourcable对象source,该对象通过构造函 数进行初始化。然后它实现了Sourcable.java接口,以期保持与source同样的接口,并在重写的operation()方法中调用 source的operation()函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。

Java代码

package pattern.decorator;

public class Decorator1 implements Sourcable {

private Sourcable sourcable;

public Decorator1(Sourcable sourcable){

super();

this.sourcable=sourcable;

}

public void operation() {

System.out.println("第1个装饰器前");

sourcable.operation();

System.out.println("第1个装饰器后");

}

}

装饰器类Decorator2.java是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如

Java代码

package pattern.decorator;

public class Decorator2 implements Sourcable {

private Sourcable sourcable;

public Decorator2(Sourcable sourcable){

super();

this.sourcable=sourcable;

}

public void operation() {

System.out.println("第2个装饰器前");

sourcable.operation();

System.out.println("第2个装饰器后");

}

}

装饰器类Decorator3.java是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序

Java代码

package pattern.decorator;

public class Decorator3 implements Sourcable {

private Sourcable sourcable;

public Decorator3(Sourcable sourcable){

super();

this.sourcable=sourcable;

}

public void operation() {

System.out.println("第3个装饰器前");

sourcable.operation();

System.out.println("第3个装饰器后");

}

}

这时,我们就可以像使用对象的适配器模式一样来使用这些装饰器,使用不同的装饰器就可以达到不同的装饰效果。如下测试类:首先需要创建一 个源类对象source,然后根据将对象使用Decorator1来装饰,并以此使用Decorator2、Decorator3进行装饰,装饰后的对象同样具有与source同样的接口。

Java代码

package pattern.decorator;

public class DecoratorTest {

/**

* @param args

*/

public static void main(String[] args) {

Sourcable source = new Source();

// 装饰类对象

Sourcable obj = new Decorator1(new Decorator2(new Decorator3(source)));

obj.operation();

}

}

运行该程序的输出如下:

第1个装饰器装饰前

第2个装饰器装饰前

第3个装饰器装饰前

原始类的方法

第3个装饰器装饰后

第2个装饰器装饰后

第1个装饰器装饰后

从输出的结果可以看出,原始类对象source依次被Decorator1、Decorator2、Decorator3进行了装饰。

java 装饰器_JAVA装饰器模式相关推荐

  1. java 调试 工具_Java调试器–权威的工具列表

    java 调试 工具 Java调试是一个复杂的空间. 调试器的类型很多,工具也很多. 在此页面中,我们将介绍7种类型的调试器之间的区别,并查看每个类别中的主要工具,以帮助您为正确的工作选择正确的工具. ...

  2. java引导类加载器_Java类加载器层次结构(一)

    类加载器有一种父/子关系.除了引导类加载器外,每个类加载器都有一个父类加载器.本章通过分析ClassLoader的源码来展示java类加载器的层次结构. 根据规定,类加载器会为它的父类加载器提供一个机 ...

  3. java的安全管理器_Java安全管理器——SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...

  4. java 装饰者_java装饰者模式怎么用?

    1.使用说明 (1)装饰者模式可以带来比继承更加灵活的扩展功能,使用更加方法,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化的结果.装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继 ...

  5. java 装饰者_Java装饰者模式

    Hello,即将要写的这篇文章,是对刚刚学习完的装饰者模式的一个总结啦,也不是什么技术难点,就是巩固一下啦. 一.装饰者模式的定义 装饰者模式动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承 ...

  6. java 媒体播放器_Java多媒体播放器(三)

    No.3 vlcj 一.简介 The vlcj project first gives you Java bindings to just about all of the native functi ...

  7. java类加载器_JAVA类加载器

    虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,JVM 提 供了 3 种类加载器: 1. 启动类加载器(Bootstrap ClassLoader) 负责加载 JA ...

  8. java 类加载器_Java 类加载器

    一.概述 类加载器通过一个类的全限定名来获取描述此类的二进制字节流. 类加载器在类层次划分.OSGi.热部署.代码加密等领域发挥着重要的作用. 比较两个类是否"相等",只有在这两个 ...

  9. java 装饰流_java装饰流的使用【转】

    装饰流使用 除了按照流的方向可以把流划分为输入流和输出流两类,按照流读写数据的基本单位把流划分为字节流和字符流两类以外,还可以按照流是否直接连接实际数据源,例如文件.网络.字节数组等,将流又可以划分为 ...

最新文章

  1. 函数项目一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)...
  2. 黑马lavarel教程---9、缓存操作
  3. 事物 php,什么是php事务
  4. 如何禁用、隐藏、显示Windows11上的小部件菜单
  5. yolox: AssertionError: Caught AssertionError in DataLoader worker process 0.
  6. html背景图适应div_CSS实现背景图片屏幕自适应
  7. ubantu的下载和在虚拟机VM中的安装
  8. Alpha混合(二)Material Alpha
  9. Linux 系统使用之 VMware Tools安装
  10. JSP→基本语法/静态内容/指令/动作/表达式/小脚本(Scriptlet)/声明/注释、JSP页面声明周期、代码样例、九大隐式内置对象及方法代码样例
  11. 如何用微观数据分析玩家流失
  12. Java中this的作用(简单说明)
  13. 注册cuteftppro 8.3
  14. 《东周列国志》第五十回 东门遂援立子倭 赵宣子桃园强谏
  15. apache评分表的意义_APACHE 评分
  16. 计算机安全威胁防范,计算机网络安全威胁及防范措施
  17. 7-11 输出大写英文字母 (15 分)
  18. GitHub项目、代码搜索、使用等技巧
  19. Android Studio一直停留在MyApplication:syncing(解决方案)
  20. 算法 64式 7、搜索算法整理_第2部分_16到30题

热门文章

  1. 10.Java 面试题整理(CORBA 方面)
  2. 大数据学习笔记:Hadoop生态系统
  3. Java学习笔记1.1.3 搭建Java开发环境 - 编写并运行Java程序
  4. 二进制数表示形式:原码、反码与补码
  5. 《天天数学》连载32:二月一日
  6. Python案例:飞船向右发射子弹
  7. 安卓案例:标准化测试
  8. tensorflow2.0 图像处理项目_航天泰坦丨国产自主遥感图像处理软件当自强
  9. [C++]variadic function template expansion 变元函数参数的展开规则
  10. Intel Core Solo/Duo处理器架构/微架构/流水线 - 前端/数据预取/SSE3