您的位置:首页 > 编程语言 > Java开发

nf设计模式 - 修饰模式 (Decorator pattern) 的 Java 实现

2015-11-23 00:22 274 查看

简介

修饰模式 (Decorator pattern) ,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。(维基百科-修饰模式

这是什么意思呢?

其实在我们面向对象设计的时候,经常会遇见两个对象功能只差了那么一点点,但是却需要重新设计整个框架结构的情况。甚至有时候,我们要求在运行时才确定一个对象应该具备的行为。

而这,是传统生成子类的方法所不能实现的。因此,我们发明了修饰模式这个工具。

发送信件的例子

假设我们在替一个邮局设计一个管理邮件的系统,这个邮局一共有以下几种信件或包裹可供选择:

普通信件

汇款信件

加急信件

挂号信

收条

感谢信

按照我们以往的想法,这个系统设计起来很简单,只需要拥有一个 Letter 接口 (Interface),然后创建六个不同的类去实现 (implements) Letter 就可以了。

但是如果邮局要求:

普通信件、汇款信件同时可以是加急信件、挂号信件或加急挂号信。

收件人收到汇款信以后可以免费发送一封感谢信给寄件人。

收件人收到挂号信以后自动发送一个收条给寄件人。

加急信件费用是普通信件基础上的两倍。

汇款信件将额外收取汇款金额+信件费用 1% 的手续费。

这样的话,按照传统的设计方法,我们就需要创建很多很多的子类(普通信件、普通加急、普通加急挂号、汇款信件、汇款加急、汇款挂号、汇款加急挂号)。而这样是不现实的,因为假设我们有 10 个类别的信,每个类别可以和其他类别相互组合,最多可以组合 3 次。这样我们就需要去设计 10310^{3} 个类。

这样不仅浪费时间,更是浪费了计算资源。

而使用修饰模式则可以完美地解决这个问题。

首先看一下使用修饰模式在这个情况下应该如何创建一封信:

Letter letter = new PromissoryLetter(20000,new UrgentLetter(new SimpleLetter(new Person("Sender"), new Person("Receiver"), "Salary")));
/*
PromissoryLetter 是汇款信件的类,其构造函数是 PromissoryLetter(float moneyToTransfer, Letter decoratedLetter);
UrgentLetter 是加急信件的类
SimpleLetter 是信
Person 是一个人的类,其构造函数是 Person(String name);
*/


这个例子很简单地解决了上述的问题,我们使用了 PromissoryLetter 和 UrgentLetter 修饰 SimpleLetter,使一封 SimpleLetter 具有汇款和加急的功能。而这一切只需要在实例化 Letter 的时候动态地添加功能。

以下是 UML 设计图和必要实现:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: