(文章翻译自Java Design Pattern: Decorator – Decorate your girlfriend

1.装饰模式的来历

让我们假设你在寻找一个女朋友。有来自像没美国中国日本法国等等的不同国家的女孩。她们有不同的习惯和个性。在一个像eharmony.com的约会网站,如果每个类型的女孩都是一个独立的Java类,这样就会有成千上万个类。这样就会导致一个严重的叫做类爆炸的问题。还有就是这个设计不同扩展的。不管在任何时候只要有一个心的女孩类型,一个新的类就需要被创建。

让我们改变这个设计,让每一个习惯\性格能够可以动态应用到一个女孩身上的装饰器。

2.类图

女孩是一个顶层的抽象类,我们有来自于不同国家的女孩。使用一个GirlDecorator 类,我们可以通过增加新的装饰器去装扮有任何特征的女孩。

3.装饰模式Java代码

Girl.java

public abstract class Girl {
String description = "no particular"; public String getDescription(){
return description;
}
}

American.java

public class AmericanGirl extends Girl {
public AmericanGirl(){
description = "+American";
}
}

EuropeanGirl.java

public class EuropeanGirl extends Girl {
public EuropeanGirl() {
description = "+European";
}
}

GirlDecorator.java

public abstract class GirlDecorator extends Girl {
public abstract String getDescription();
}

Science.java

public class Science extends GirlDecorator {

	private Girl girl;

	public Science(Girl g) {
girl = g;
} @Override
public String getDescription() {
return girl.getDescription() + "+Like Science";
} public void caltulateStuff() {
System.out.println("scientific calculation!");
}
}

我们能够不受限制对每一个装饰器增加更多的方法像Dance()

Art.java

public class Art extends GirlDecorator {

	private Girl girl;

	public Art(Girl g) {
girl = g;
} @Override
public String getDescription() {
return girl.getDescription() + "+Like Art";
} public void draw() {
System.out.println("draw pictures!");
}
}

Main.java

package designpatterns.decorator;

public class Main {

	public static void main(String[] args) {
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription()); Science g2 = new Science(g1);
System.out.println(g2.getDescription()); Art g3 = new Art(g2);
System.out.println(g3.getDescription());
}
}

输出:

+American

+American+Like Science

+American+Like Science+Like Art

我们可以向下面这样做:

Girl g = new Science(new Art(new AmericanGirl()));

4.在Java标准库中使用到的装饰器设计模式

一个典型使用装饰器设计模式就是JavaIO类

下面是一个简单的例子-BufferedReader 装饰InputStreamReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object

InputStreamReader(InputStream in) -从byte流到character流的桥。InputSteamReader读取字节而且将他们转换成使用执行字符编码格式的字符。

BufferedReader(Reader in) - 为了提供更加有效的读取范式(readLine())从一个字符流和缓存字符读取文本

[译]Java 设计模式之装饰器的更多相关文章

  1. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  2. java设计模式之七装饰器模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  3. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  4. Java设计模式之装饰器模式

    1.装饰器模式的定义(保持接口,扩展功能) Decorate装饰器,顾名思义,就是动态的给一个对象添加一些额外的职责,就好比对房子进行装修一样. 2.装饰器模式的特征 具有一个装饰对象. 必须拥有与被 ...

  5. java设计模式之装饰器模式以及在java中作用

    在JAVA I/O类库里有很多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的,下面以FilterInputStream为例介绍装饰器模式的使用  FilterInputStream和F ...

  6. java 设计模式 之 装饰器模式

    装饰器模式的作用 在不修改原先对象核心的功能的情况下,对功能进行增强. 增强对象的功能的途径 通过类继承的方式,对父对象进行增强操作,例如造车是父类,改装跑车,跑车加大灯,改装房车,房车加私人电影院. ...

  7. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  8. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

  9. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

随机推荐

  1. Vim常见操作汇总

    1.跳到文本的最后一行:按“G”,即“shift+g”2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”.3.跳到第一行的第一个字符:先按两次“g”,4 ...

  2. 解决LINUX vncserver 启动 could not open default font &#39;fixed&#39;错.

    安装vncserver例如,会发生以下错误:  vncext:      VNC extension running!  vncext:      Listening for VNC connecti ...

  3. HDU1160(LIS)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:求体重下降.速度添加的样例最多有多少个 依据体重降序排一下,然后求速度的最长上升子序列 , ...

  4. SQLite外键

    数据库工具:SQLite Manager(V0.7.7) SQLite版本号:V3.6.19+ SQLite Manager 默认是不开启外键的. 那么怎样,使用它创建一个带有外键的表呢? 一.开启外 ...

  5. Gallatin(大陆版)Office365中Exchange Online混合部署功能已经能够使用了

    经过測试,Exchange混合部署已经能够使用了 前置条件: 本机至少须要一台Exchange Server 2013作为混合部署server 须要一个公网域名 domian.com,能够和内部域名不 ...

  6. JQUERY省、市、县城市联动选择

    JQUERY 插件开发——CITYLINKAGE(省.市.县城市联动选择) 第一部分:背景   开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前 ...

  7. eclipse 对齐行号在括号中显示和字体调整

    笔者 : 本笃庆军 一.括号对齐:指和C/C++里面一样.上下括号对齐~~~ 第一步:Project->preferences->Java->Code Style->Forma ...

  8. php_linux_centos6.4_安装mysql_apache_php

    原文:php_linux_centos6.4_安装mysql_apache_php 原文 : http://blog.csdn.net/xiaoliouc/article/details/176395 ...

  9. asp.net学习之再论sqlDataSource

    原文:asp.net学习之再论sqlDataSource 本节从上一节没有阐述的几个方面,再讨论一下SqlDataSource的用法及注意的事项.     上一节的链接地址如下:http://www. ...

  10. MSMQ-发送消息到远程专用队列 实例

    目录 一:MSMQ的一些理论上的知识 二:队列类型(Queue Type) 三:安装消息队列 四:在C#中Messagequeue class 五:MSMQ-发送消息到远程专用队列 六:例子   一. ...