(文章翻译自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. Struts1项目转成Struts2项目步奏

    注意:要转成Struts2必须struts2配置和流程理解,我不知道,我只能说还是知道struts2然后转成struts2对. 1.先备份一份.不要没转成功项目搞蹦了都回不来了. 2.导入Struts ...

  2. Cache基础知识OR1200在ICache一个简短的引论

    以下摘录<步骤吓得核心--软-core处理器的室内设计与分析>一本书 12.1 Cache基本知识 12.1.1 Cache的作用 处理器的设计者通常会声称其设计的处理器一秒钟能做多少次乘 ...

  3. BZOJ 1823 JSOI 2010 盛宴 2-SAT

    标题效果:有着n材料的种类,m陪审团. 每种材料具有两种不同的方法.每个法官都有两个标准.做出来的每一个法官的菜必须至少满足一个需求. 问:是否有这样一个程序. 思考:2-SAT经典的内置图形问题.因 ...

  4. win9x_win2k下对物理磁盘的操作

    void CReadSectorDlg::OnReadButton() { UpdateData (TRUE) ; CFile m_Sector_file ; char * buffer ; if ( ...

  5. Linux 火狐浏览器安装Flash插入

    Linux系统安装完毕,找到Firefox浏览器和视频播放器不能总是提示安装Flash.而据火狐浏览器的提示Flash插件安装总是失败,能手动安装Flash插件啦. 到Flash官网:http://g ...

  6. Composer常见问题

    Composer常见问题 原文链接:Composer常见问题 安装了Composer后,运行composer --version,查看Composer的版本号.如果出现下面的提示,那么软件安装成功. ...

  7. Quartz.Net任务统一调度框架

    山寨版Quartz.Net任务统一调度框架   TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用, ...

  8. hdu1881 毕业bg(深搜索dfs)

    主题链接:pid=1881">http://acm.hdu.edu.cn/showproblem.php? pid=1881 ----------------------------- ...

  9. Ubuntu下一个openldapserver部署步骤

    1:安装zlib 下载zlib-1.2.3.tar.gz(或其它版本号) wget http://down1.chinaunix.net/distfiles/zlib-1.2.3.tar.gz # . ...

  10. linux_redhat_线程后台运行方法

    建议看完1:后直接看2 screen 方式熟练些可靠. 次方法适用于redhat系统,unbunt* 系统用screen 命令 产看系统版本 cat /proc/version 首先项目制作的sh文件 ...