讲故事学设计模式-装饰者(Decorator)模式

本文通过一个关于找女朋友的故事引入装饰者模式的概念,并详细解释了如何在Java中使用该模式来动态添加特性,同时提供了类图和源码实例进行说明。此外,还讨论了装饰者模式在Java标准类库中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰者模式可以给一个已经创建的对象动态添加特性。接下来我将用一个小例子简单介绍装饰者模式。

1、故事

假设你现在想找个女朋友,与你相亲的对象可能是来自于世界各地的女孩子,比如美国、中国、日本等等。她们可能性格迥异,喜好不一。在婚恋网站上,比如世纪佳缘,如果每一个不同类型的女孩都是一个单独的Java类,那将有成百上千个类。这将是一个严重的问题:class explosion(类爆炸)。而且,这样的设计是不可扩展的。如果再来一新妹纸,只能再创建一个新的Java类。

2、类图


最上面是一个抽象类Girl,我们按照地区定义了不同的类如,AmericanGirl,EuropeanGril。我们通过继承GrilDecorator添加新的装饰器来装饰每一个妹纸。

3、源码

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

AmericanGirl.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!");
	}
}

我们可以毫无顾忌的给每个decorator(Science、Art)添加更多的方法,例如“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 Girl
+American Girl+Like Science
+American Girl+Like Science+Like Art

我们也可以这样创建一个妹纸:
Girl g = new Science(new Art(new AmericanGirl()));

4、在Java标准类库中的应用

最典型的就是在java.io中的应用,下面是BufferedReader装饰InputStreamReader的例子:
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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值