概述
装饰器模式(Decorator Pattern),允许向一个已有的对象添加新功能,同时又不改变其结构,属于结构型模式。
它是作为现有类的一个包装。
装饰器模式是在不改变原类文件和使用继承的基础上,动态扩展一个对象的功能。它通过创建一个包装对象,也就是装饰来包裹真实的对象。
这种模式创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。
意图:动态为一个对象添加额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。
主要解决:由于使用继承会为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
使用场景:在不增加很多子类的情况下扩展类。
关键代码:Component类充当抽象角色,不具体实现。装饰类引用和继承Compoment类,具体扩展类重写父类方法。
实例
创建一个Shape接口和实现该接口的实体类,然后创建一个实现Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量。
创建Shape接口
public interface Shape {
void draw();
}
创建Shape接口的实现类
Circle类
public class Circle implements Shape {
public void draw() {
System.out.println("圆形。。");
}
}
Rectangle类
public class Rectangle implements Shape {
public void draw() {
System.out.println("矩形。。");
}
}
创建实现Shape接口的抽象装饰类ShapeDecorator
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape) {
this.decoratedShape = decoratedShape;
}
public void draw() {
decoratedShape.draw();
}
}
创建扩展了ShapeDecorator的实体装饰类
public class RedShapeDecorator implements ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape) {
System.out.println("红色边框。。。");
}
}
测试类
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("普通边框圆形:");
circle.draw();
System.out.println("-------------------");
System.out.println("红色边框圆形:");
redCircle.draw();
System.out.println("-------------------");
System.our.pintln("红色边框矩形:");
redRectangle.draw();
}
}
输出结果
总结
装饰器模式的特点
不改变原类文件,不使用继承,动态扩展。
与桥接模式的区别
两个模式都是为了解决过多子类对象问题,但两者诱因不同。桥接模式是对象自身现有机制沿着多个维度变化,是既有的部分不稳定。
装饰器模式是为增加新的功能。
与适配器模式的区别
适配器模式其实也是一种包装模式,适配器模式的意义是将一个接口转换成另一个接口,目的是通过改变接口来达到复用的目的。装饰器模式不需改变被装饰的接口,恰恰是要保持原有的接口,增强原有接口的功能,或改变原有对象的处理方法。