装饰器模式
介绍
装饰器模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰器模式也体现了开闭原则(ocp)。属于结构型模式。
装饰器模式就好像打包一个快递。被装饰器(主体)是快递的物品,它需要装饰器(包装)来包装原有的类,并在保持原有类结构不变的前提下,提供额外的功能。
何时使用:在不想增加很多子类的情况下扩展类。
拓展类的功能有两种,一种是继承。继承就是用来拓展类的功能的,但它是对类的层级进行扩展。另一种方法是关联,将一个类嵌套在另一个装饰器类之中,然后在装饰器类中拓展子类方法的功能。这样不需要修改类的层次或者原有的逻辑(灵活)
基本思想如下:
void 装饰器方法() { 前置拓展功能; 被装饰对象的方法执行; 后置拓展功能 }
这个抽象的被装饰器称为Component,而装饰器为Decorator
其中,装饰器Decorator需要去继承Component,因为装饰器作为一个套在别人外面的“盒子”,应该需要让调用方知道,装饰器和被装饰的对象具有同样的功能(只是功能被扩展了变得更加强大)
实现
public class DecoratorPattern {}
interface Robat {
void doSomething();
}
class FirstRobot implements Robot {
@Override
public void doSomething() {
// 基本功能
}
}
// 装饰器对象
class RobotDecorator implements Robot {
// 被装饰的对象
private Robot robot;
public RobotDecorator(Robot robot) {
this.robot = robot;
}
@Override
public void doSomething() {
robot.doSomething();
}
public void doMore() {
// 拓展功能
}
}
java的IO的应用
InputStream是一个抽象类,即Component
FilterInputStream过滤器输入流,是一个装饰器类Decorator,它对其余三种输入流进行了扩展
public class FilterInputStream extends InputStream {
// 被装饰的对象
protected volatile InputStream in;
}
代理模式与装饰器模式
代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。
装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。
对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能
对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。