装饰者模式,见名知意。装饰装饰,何为装饰,无非就是在某个东西上外面再套一层东西,装饰者模式大概就是这样的。
比如现在有一个类A,我们想为它增加一些新的功能,但又不想修改它原来的代码,怎么办?直接的想法是继承,但继承灵活性并不好,推荐多用组合,少用继承。
应用组合:新建一个类B(装饰者),把A(被装饰者)组合到B中,就可以让B行使A的职能,但应该注意两点:
一、A和B应该有相同的超类或接口,这样才能够利用多态在使用A的地方使用B,我们采用继承,让B继承自A。
二、让B继承自A并不是为了继承A类中的方法,而仅仅是声明一个共同的类型,使得在外人看来,A和B是一样的。
上例子:
这是被装饰者
public class Obj {
public void doSth(){
System.out.print("i do sth.");
}
public void doSthElse(){
System.out.print("i do sth else.");
}
}
现在,我们要扩展它的功能,使得Obj实例在执行doSth()方法时,在后面添加执行时间,而在执行doSthElse()时,在后面添加执行地点。
这是装饰者:
public class DecoraterObj extends Obj {
private Obj obj;
public DecoraterObj(Obj obj){
this.obj = obj;
}
public void doSth() {
obj.doSth();
System.out.println(" at " + new Date());
}
public void doSthElse() {
obj.doSthElse();
System.out.println(" at somewhere.");
}
}
装饰者DecoraterObj继承自被装饰者Obj,故二者拥有相同的对外“接口”,我们本来要使用Obj的地方,现在可以直接使用DecoraterObj了,而且就像在使用Obj一样,因为DecoraterObj中组合了一个Obj引用,它提供了原来Obj的功能,唯一不同的是,我们可以在DecoraterObj中对原Obj进行扩展,可以随意在它之前或之后添加功能。
测试:
public class Main {
public static void main(String[] args) {
Obj obj = new DecoraterObj(new Obj());
obj.doSth();
obj.doSthElse();
}
}
就这样,我们看起来在使用Obj,其实我们已经在它外面又包装了一层。
这个是不是很眼熟?装饰者模式在java I/O中用得非常多,所以我们经常可以看到比如以下代码:
new InputStreamReader(new ButteredInputStream(new InputStream()))
InputStream类提供最简单的二进制读取,外面包装一层BufferedInputStream,提供缓冲功能,然后外面再包装一层InputStremReader,提供以字符方式读取功能。
总结:
装饰者模式的关键在于:统一对外“接口”、多态调用。
分享到:
相关推荐
设计模式(Design pattern)是一套被反复使用、...本章系Java之美[从菜鸟到高手演变]系列之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师!
深入浅出设计模式 pdf 深入浅出设计模式 中文版 设计模式 下载说明: 因个人上传资源大小只能是20M,而该书的PDF格式过大,所以只能分开上传。如有不便请谅解。【该书一共13章,在上传的时候我尽量按章节顺序打包...
### 白话说电气_相电压和线电压的分析 #### 一、相电压与线电压的概念 在我国,普遍采用的是三相四线制供电系统。在这个系统中,三根相线(A、B、C相)与一根地线(零线)构成了整个供电网络。在三相四线制中,相...
在本文件《白话说电气_电机制动的几种常见方式.pdf》中,尽管内容无法完全辨识,但根据文件名和部分内容推测,该文件应该是详细介绍了几种电机制动方式。这里,我们可以根据电力系统相关知识推断出一些关于电机制动...
《白话设计模式》文档很可能是以通俗易懂的方式介绍设计模式的入门读物。 在软件开发过程中,设计模式可以帮助我们更有效地组织代码,提高代码的可读性和可维护性。设计模式通常分为三类:创建型、结构型和行为型...
在软件设计中,设计模式是一种解决常见问题的模板,它们是经过验证的、高效的设计解决方案。本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种...
为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也有几个朋友给我点鼓励,给了star。本文工程...
java课程设计大作业,java、算法练手项目,适合初学java、数据结构的同学拿来学习研究,基于java、GUI开发的小游戏,程序都经过测试,可以直接运行,资源含程序运行所需的源码、资源文件等全部数据,有需要的可放心...
文档加代码,如果看完pdf,观察者模式还没学会,感觉你没必要学设计模式了,文档非常通俗易通,适合新手上手。
《白话C++》是一本非常适合初学者入门的编程书籍,其主要目标是用通俗易懂的语言教授C++编程知识,让学习者在轻松愉快的氛围中掌握这门强大的编程语言。C++作为一门静态类型、编译型、并发型且支持面向对象编程的...
策略模式是设计模式中的一种 객체行为型模式,它定义了一系列算法,封装每一个算法,并使它们可以互相替换。策略模式使得算法可以独立于使用它的客户而变化。 概述 在软件开发中,经常遇到类似的情况,实现某一个...
java课程设计作业——模仿大富翁游戏,使用Java Swing (GUI) 实现的单机游戏,遵循MVC设计模式 A Java Swing (GUI) game. 单机版的大富翁游戏,纯Java实现,采用MVC设计模式。 所有素材来自 大富翁客户端+冒险岛...
白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-中台是个什么鬼.pdf白话中台战略-...
作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。
作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。
这本书作者Eric Freeman 和Elisabeth Freeman使用白话文的方式,清楚的介绍了全部23种设计模式。简洁易懂。共13章节。此为封面、目录
作者Eric Freeman 和Elisabeth Freeman,使用白话文的形式在讨论中介绍23中设计模式,有异与原《设计模式》更加通俗易懂。通过实际事例来讲解每一个设计模式,生动有趣,不会感觉到枯燥。