理解名称
装饰器模式(Decorator Pattern)属于结构型模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。 该模式强调一个思想:组合优于继承
作用
- 解决继承关系过于复杂的问题,通过组合来替代继承
- 给原始类添加增强功能
适用场景
需要给原始类添加增强功能,又不能通过继承的方式避免子类数量爆炸
装饰器模式和代理类模式对比:代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。
代码示例
需求:为形状类新增一个功能,能够画上不同的颜色,同时又不改变形状类。
定义形状接口:
public interface Shape {
void draw();
}
创建实现接口的实体类
// 矩形
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
// 圆形
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
创建实现了 Shape 接口的抽象装饰类
public class ColoredShapeDecorator implements Shape {
private Shape decoratedShape;
private String color;
public ColoredShapeDecorator(Shape decoratedShape, String color) {
this.decoratedShape = decoratedShape;
this.color = color;
}
@Override
public void draw() {
decoratedShape.draw();
drawColor();
}
public void setColor(String color) {
this.color = color;
}
private void drawColor(){
System.out.println("Shape's Color:" + color;);
}
}
使用示例
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ColoredShapeDecorator redCircle = new ColoredShapeDecorator(new Circle(), "red");
System.out.println("Circle with no color");
circle.draw();
System.out.println("Red Circle");
redCircle.draw();
}
}
业界经典实现
- JAVA IO