装饰者模式可以给一个已经创建的对象动态添加特性。接下来我将用一个小例子简单介绍装饰者模式。
1、故事
假设你现在想找个女朋友,与你相亲的对象可能是来自于世界各地的女孩子,比如美国、中国、日本等等。她们可能性格迥异,喜好不一。在婚恋网站上,比如世纪佳缘,如果每一个不同类型的女孩都是一个单独的Java类,那将有成百上千个类。这将是一个严重的问题:class explosion(类爆炸)。而且,这样的设计是不可扩展的。如果再来一新妹纸,只能再创建一个新的Java类。
2、类图
3、源码
public abstract class Girl {
String description = "no particular";
public String getDescription(){
return description;
}
}
public class AmericanGirl extends Girl {
public AmericanGirl(){
description = "+American";
}
}
public class EuropeanGirl extends Girl {
public EuropeanGirl() {
description = "+European";
}
}
GirlDecorator.java
public abstract class GirlDecorator extends Girl {
public abstract String getDescription();
}
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!");
}
}
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!");
}
}
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 Girl+Like Science
+American Girl+Like Science+Like Art
Girl g = new Science(new Art(new AmericanGirl()));
4、在Java标准类库中的应用
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader(InputStream in) – 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。 .
BufferedReader(Reader in) – 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(例如readLine())。
原文:http://www.programcreek.com/2012/05/java-design-pattern-decorator-decorate-your-girlfriend/