JAVA装饰器模式
Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式。
一、定义:
Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样。因此,装饰器模式具有如下的特征:
它必须具有一个装饰的对象。
它必须拥有与被装饰对象相同的接口。
它可以给被装饰对象添加额外的功能。
用一句话总结就是:保持接口,增强性能。
装饰器通过包装一个装饰对象来扩展其功能,而又不改变其接口,这实际上是基于对象的适配器模式的一种变种。它与对象的适配器模式的异同点如下。
相同点:都拥有一个目标对象。
不同点:适配器模式需要实现另外一个接口,而装饰器模式必须实现该对象的接口。
二、 典型的装饰器模式的图:
三、相关实例:
1、 Sourcable接口定义了一个方法 operation() 。
- package pattern.decorator;
- public interface Sourcable {
- public void operation();
- }
2、 Source.java 是 Sourcable.java 的一个实现, operation() 方法的实现就是简单的负责往控制台输出一个字符串:
- 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() 函数,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。
- 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 是另一个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如
- 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 是第三个装饰器,不同的是它装饰的内容不一样,即输出了不同的字符串。其源代码如程序
- 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 同样的接口。
- 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 装饰器模式详解
转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了Java 中常见的 IO 相关知 ...
- java 装饰器模式实现代码
目录 1.实现装饰器模式 1.1.公共接口 1.2.接口实现 1.3.装饰器 1.4.装饰构件 1.5.测试装饰器 上图展示的是io流中的一个装饰者模式的代码结构 1.实现装饰器模式 汽车厂生产汽车实 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- Java设计模式07:常用设计模式之装饰器模式(结构型模式)
1. Java之装饰器模式(Decorator Pattern) (1)概述: 装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原 ...
- Java IO流以及装饰器模式在其上的运用
流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...
- java设计模式之七装饰器模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...
- java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
随机推荐
- 2014第7周四excel多列文本复制技巧
刚才win8.1强制安装更新后重启,然后一直显示“安装更新失败正在,正在撤销更改,请不要关闭计算机”,等了很久还是不行,我还是强制按下了电源按钮,然后再次开机还是这样,实在没办法只能等,过了N久后没想 ...
- android笔记1——开发环境的搭建
Long Long ago...已经成为了历史,我还是要说出一个真相:早年前,那时候,android还不被大众所认知的时候,当然开发人员也没不像如今那样趋于饱和状态.一位大牛前辈,也是我的学长,那时候 ...
- 【main()的参数探究】
恩...今天研究信安的课件的时候看到一段对于main(int argc,char *argv[])的编程 所以探究探究main()函数的参数 探究程序如下: #include <cstdio&g ...
- 纯CSS绘制三角形
扒segmentfault的导航栏时候发现的,用了个span标签写了个三角形出来,第一次发现,好神奇,查了下还有挺多种玩法的.基本的用法就是将盒子的width和height设为0,然后用border搭 ...
- js 正则表达式验证 整理
1.验证首字符是英文字母: var str="123"; var reg=/^[a-zA-Z]/; if(!reg.test(str)){ alert(str+"应以字母 ...
- S5700交换机配置端口镜像
S5700交换机配置端口镜像 <Quidway>system-view //进入系统视图 Enter system view, return user view with Ctrl+ ...
- c# 委托 delegate
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
- sql远程连接卡死解决方法
快捷键Win+R 输入CMD 回车 输入 netsh winsock reset 然后重启电脑 问题解决OK
- asp.net自动打卡、签到程序
目前公司上下班签到是上局域网的一个系统去点一下,由于打卡比较简单,所以有些快迟到的同事会找已经到公司的人帮忙代打卡.”以其它身份运行程序“来打开IE,去帮人打下,有时多几个人,也要这样操作,我感觉挺麻 ...
- 【译】Optimize caching-缓存优化
缓存优化 大部分的网页都包括不常更改的资源,比如CSS文件,图片文件,JavaScript文件等.这些资源通过网络下载需要一定的时间,这就增加了网页加载的总时间.HTTP缓存可以让这些资源通过浏览器以 ...