前言
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。在不想增加很多子类的情况下使用。装饰器是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
核心代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和实现Component 类,具体扩展类重写父类方法。结构图中有体现。
模式结构
使用步骤(菜鸟教程上的实例)
这个实例主要是形状绘制,原本有矩形和圆形,后来添加了一个颜色功能
1.创建一个接口。Shape.java
public interface Shape {
void draw();
}
2.创建接口的实体类
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");
}
}
3.创建实现了Shape接口的抽象装饰类。这里就是结构图中的Decorator.
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
4.创建扩展了 ShapeDecorator 类的实体装饰类。
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
//具体要添加的东西
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
5.进行使用
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
6.执行程序,输出结果。
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red