Java设计模式(二) Decorator(装饰)模式及Java I/O引申
来源:互联网 发布:python bytebuffer 编辑:程序博客网 时间:2024/05/18 03:18
基本概念
Decorator
- 职能上:
- 动态地给一个对象添加一些额外的职责,就增加功能来说
- Decorator比从基类生成子类更灵活,而且能有效地控制子类的数量,防止子类爆炸(后面的特性会印证这个优势)。
- 结构(工作原理)上:
可以创建始于Decorator对象(负责新功能的对象)终于原对象的一个对象链 - 实现上:
- Decorator模式将Decrator对象(能够提供额外的功能)与这些对象的使用规则分离开来,因为每个对象只关注自己的功能,而不关注自己按照如何添加到对象链中
- 这使我们有机会任意重排Decorator对象并串联,而无须改变其的任何代码。
- 因为功能的分离,Decorator对象有更好的内聚性
- 通过继承基类实现子类的方式因为对于每个排列都要重新实现,所以难以避免子类爆炸的问题。
- Decorator模式能够将子类数量控制在Decorator级别,理论上与继承方法相比是
N! 的差别。 - 因为避免了继承,所以自然而然获得了更好的封装性
- 组成上:
- Component(组件):组件的抽象,包括装饰者和被装饰者
- Concrete Component(原始组件):被装饰的对象,也就是被装饰者
- Decorator(装饰者):具体的装饰组件的抽象,包含一个抽象component的构件(具体可能是原始组件,也可能是装饰者),继承自Component
- Concrete Decorator:具体的装饰组件,用于实现具体的附加功能。
例讲Decorator(装饰者)模式
现在还处于实习生招生季,简历是一切的基石,毕竟简历不过,哪怕你是大牛,连面试的机会都没有,岂不是开心的不行,往往我们的简历是有针对性的,对于不同的公司和不同的岗位,应聘腾讯后台,鼓吹阿里和Java就是你的不对了……可是给每个公司都写一份简历,那就不开心了,所以我们可以采用装饰者模式
- 基本角色的实现
Component:
abstract class Component { public abstract void print();}
Decorator:
abstract class Decorator extends Component{ private Component component; Decorator( Component component ){ this.component = component; } @Override public void print(){ component.print(); }}
Concrete Component:
class Resume extends Component{ @Override public void print() { System.out.println("My Name: llin\n" +"My Major: Software Engineering" +"My University: Tianjin University" ); }}
Concrete Decorator:
class AliDecrator extends Decorator{ AliDecrator(Component component) { super(component); } @Override public void print() { super.print(); System.out.println("I want a position at Ali major in Java"); }}class TencentDecorator extends Decorator{ TencentDecorator(Component component) { super(component); } @Override public void print(){ super.print(); System.out.println("I want a position at QQ major in C++"); }}
测试用类:
public class decoratorEg { public static void main ( String [] args ){ Component resume = new Resume(); Component aliResume = new AliDecrator( resume ); Component QQResume = new TencentDecorator( resume ); aliResume.print(); System.out.println(""); QQResume.print(); }}
测试结果如下:(其实在大量拓展,大量排列组合时才能更好地凸显出Decorator模式的优势)
Decorator的应用场景
- 装饰类和被装饰类可以独立发展,而不会互相耦合,所以具有易维护的特性
- 相对于继承,能够有效地防止子类爆炸,具有易拓展性和易复用性
- 装饰者模式是继承关系的一种替代方案,我们通过例子可以看出,装饰之后返回的依然是Component的接口,实现的是一个is-a的关系。
Java I/O中的Decorator模式
在InputStream和OutputStream上添加各种功能,类似缓存、文件读入等等一系列功能拓充都是Decorator模式下的产物
Decorator和Adapter两种模式的比较
- 两种模式都是包装模式,都是起到包装一个对象或类的作用
- 适配器的意义在于将一个接口包装成另一个接口,它的目的是通过改变接口达到重复使用的作用
- 装饰器不改变对象的接口,而是恰恰要保持原来的接口,但是增强原有对象的功能,或改变原有对象的处理方法而提升性能。
这次没有鸡汤…………
1 0
- Java设计模式(二) Decorator(装饰)模式及Java I/O引申
- Java设计模式(一) Adapter(适配器)模式及I/O实例引申
- Java I/O编程 装饰设计模式及应用
- java I/O之装饰设计模式
- 设计模式之装饰者模式(二)---java中的装饰者I/O结构
- Java设计模式-----Decorator装饰模式
- java设计模式:装饰器模式[Decorator]
- java设计模式:装饰器模式[Decorator]
- Java设计模式 - Decorator(装饰模式)
- Java设计模式-----Decorator装饰模式
- Java设计模式:装饰者模式(Decorator)
- java设计模式之装饰模式Decorator
- Java设计模式-----Decorator装饰模式
- Java设计模式----------装饰模式(Decorator)
- Java设计模式---装饰模式(Decorator)
- 设计模式-装饰模式Decorator JAVA示例
- Java设计模式----装饰模式(Decorator)
- JAVA设计模式之装饰模式(decorator)
- mac下SVN服务器命令行
- Controller设计
- 利用OpenSSL库对Socket传输进行安全加密
- shell脚本学习笔记 (流编辑器sed)
- 栈的数组表示
- Java设计模式(二) Decorator(装饰)模式及Java I/O引申
- 通过八叉树进行空间分割和搜索
- 练习17:更多读写练习
- 开源imageload的使用
- HDU-3081-Marriage Match II(最大流+并查集+二分)
- visual studio 2013和sql server数据库连接
- 基于 SoapUI 工具测试 Rest 服务
- [Android Studio系列(三)]Android Studio 编译、同步慢的解决方法
- IOS 给View添加阴影效果