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 设计图和必要实现:
相关文章推荐
- Java中的jar命令
- 关于思想,关于那些事
- Spring 上传文件
- Spring MVC 详解
- spring 两个 properties
- 使用Adobe Reader控件结合Java实现PDF打印功能
- Struts2学习笔记
- java中的值传递和引用传递
- 浅谈Struts2的命名空间及以传统形式返回json数据
- java文件输入输出
- Spring with Hibernate persistence and transactions
- Java基本数据类型与封装类的区别
- Java synchronized
- Java包 Package
- Java虚拟机类加载机制
- java内部类
- JAVA_SE基础——54.异常
- java提供的一些并发机制
- Java线程池技术
- 【Java学习笔记】——JDK与JRE的区别