设计模式系列--Decorator

本文详细解析了Decorator设计模式的概念、适用性、实例,并通过代码展示了其在IO包中的应用,特别是如何使用BufferedInputStream作为装饰器类。文章深入探讨了设计模式的灵活性和实用性,同时提供了对IO基本概念的理解链接,帮助读者更好地掌握相关技术。

  一.类图

  二.意图

  动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。

  三.适用性

  a) 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

  b) 处理那些可以撤销的职责。

  c) 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,似的子类数量呈爆炸性增长。另一种情况是因为类定义被隐藏,或类定义不能适用于子类。

  四.实例

  大学阶段90%的学生考试都有作弊的情况(我属于10%中的学生),对于90%的学生来说作弊已经是考试必不可少的一部分。所以用这个例子我们来说明一下Decorator设计模式。

 

package explore.decorator;

public interface Exam {
public void doExam();
}

package explore.decorator;
//作弊形式
public class Cheat implements Exam {
private Exam exam;
public Cheat(Exam exam) {
this.exam = exam;
}
public void doExam() {
exam.doExam();
}
}

package explore.decorator;
//携带纸条的形式作弊
public class CheatByNote extends Cheat {
public CheatByNote(Exam exam) {
super(exam);
}

public void doExam() {
super.doExam();
System.out.println("考试中用纸条的形式作弊...");
}
}

package explore.decorator;
//录音的形式作弊
public class CheatBySound extends Cheat {

public CheatBySound(Exam exam) {
super(exam);
}

public void doExam() {
super.doExam();
System.out.println("考试中用录音的形式作弊...");
}
}

package explore.decorator;
//英语考试
public class EnglishExam implements Exam {

@Override
public void doExam() {
System.out.println("参加英语考试...");
}

}

package explore.decorator;

public class Client {
public static void main(String[] args) {
Exam cheat1 = new CheatByNote(new CheatBySound(new EnglishExam()));
cheat1.doExam();
}
}

 

记住这个作弊的实例,理解Decorator的设计思想。

五.Decorator模式在IO包中的应用

  说明:首先大家对IO得有一个大概的了解, 比方说大致的用法,装饰器类有哪些等等。推荐一个学习IO的文章:http://www.cnblogs.com/focusj/archive/2011/08/10/2136414.html如果你还没有用IO写过一个读写文件的例子,那么请先看上边的文章,否则下面的东西你可能看不懂。

 

  IO中装饰器类形式的体现,其中装饰器类是BufferedInputStream

 

BufferedInputStream in = new BufferedInputStream(new FileInputStream("path"));

 

我们来看一下BufferedInputStreamFileInputStreamFilterInputStream的定义。

public
class BufferedInputStream extends FilterInputStream {
... ...

public
class FileInputStream extends InputStream
{
... ...

public
class FilterInputStream extends InputStream {
/**
* The input stream to be filtered.
*/
protected volatile InputStream in;
... ...

FilterInputStream类是(Input类型)装饰器类的父类,所有的装饰器类都继承自这个类。从上面的JDK源码中可以看出BufferedInputStream不出意外的继承了FilterInputStreamFilterInputStream继承了InputStreamFileInputStreamInputStream的一个实现类。说了这么多我们用这几个类往Decorator模式的类图上套用一下:

到此为止,Decorator模式分析完成。

声明:1. 关于设计模式的适用性和意图以及优缺点这是相当于定理性的东西,我们已经没有机会发挥了,所以我完全照搬。但是,实例和对一些源码的分析是自己的东西,这里面有我自己的理解。

2. 设计模式系列的文章讲解的部分很少,我只是为了回忆知识,点到为止。大家有不理解的地方第一时间通知我,我们及时沟通交流。 







转载于:https://www.cnblogs.com/focusj/archive/2012/03/18/2404713.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值