[译]Java 设计模式之装饰器
(文章翻译自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 设计模式之装饰器的更多相关文章
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- java设计模式之七装饰器模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- Java设计模式之装饰器模式
1.装饰器模式的定义(保持接口,扩展功能) Decorate装饰器,顾名思义,就是动态的给一个对象添加一些额外的职责,就好比对房子进行装修一样. 2.装饰器模式的特征 具有一个装饰对象. 必须拥有与被 ...
- java设计模式之装饰器模式以及在java中作用
在JAVA I/O类库里有很多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的,下面以FilterInputStream为例介绍装饰器模式的使用 FilterInputStream和F ...
- java 设计模式 之 装饰器模式
装饰器模式的作用 在不修改原先对象核心的功能的情况下,对功能进行增强. 增强对象的功能的途径 通过类继承的方式,对父对象进行增强操作,例如造车是父类,改装跑车,跑车加大灯,改装房车,房车加私人电影院. ...
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- 设计模式:装饰器(Decorator)模式
设计模式:装饰器(Decorator)模式 一.前言 装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
随机推荐
- PHP设计模式——备忘录模式
声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...
- 一个由proguard与fastJson引起的血案(转)
更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆 根本原因,fastjson使用姿势不对. 问题描述: 一个发件人列表里,应当呈现的数据(这里命名为Com ...
- Ubuntu设置交换空间參考教程[图]
假设你当前使用的Ubuntu系统,不管是虚拟机还是实体机,没有交换分区或交换分区空间不足,能够为其设置交换空间. 本文提供的是一种设置交换空间的简单方法. 如若转载,请注明博文地址及原作者(Risin ...
- http headers
什么是HTTP Headers HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比 ...
- PHP课程十大 PHP图像处理功能和实现的验证码
假如你喜欢这个博客,访问这个博客地址:http://blog.csdn.net/junzaivip 总结: gd绘图库: 数学函数 PHP图片处理函数 图片处理函数使用场景 1.验证码 2.缩放 3. ...
- sql 子查询stuff功能(同一个人的多任务,多领域成为字符串)
USE [erp2015] GO /****** Object: StoredProcedure [dbo].[GetUser] Script Date: 03/14/2015 13:27:04 ** ...
- java线 生产者和消费者
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Tsql查询执行顺序
对于T-SQL编程,用得最广泛的,莫过于查询(Querying).要想写出高质量.高性能的查询语句,必须深入地了解逻辑查询处理. 一.逻辑查询处理的各个阶段 (5)SELECT DISTINCT TO ...
- Hard Parse&Soft Parse
DDL每次运行将必须是难以解决. SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过程: 1.语法检查(syntax check): 检查此sql的拼写是否语法. 2.语义检查(seman ...
- Configuration配置信息管理
Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...