下图为所有设计模式,带标记为重点掌握以及工作中常用到的:
装饰模式属于结构型模式之一,其作用是向一个现有的对象添加新的功能,同时又不改变其结构,有点我们Spring中AOP的意思。
模式名称 | 优点 | 缺点 | 应用场景 |
---|---|---|---|
装饰模式 | 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 | 多层装饰比较复杂 | 1、扩展一个类的功能。 2、动态增加功能,动态撤销 |
注意事项:装饰模式作用是扩展一个类,因此是可以代替继承的。
装饰模式
1、创建一个形状接口
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、创建实现了形状接口的抽象装饰类
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
4.创建扩展了抽象装饰类的实体装饰类
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.使用实体装饰类来装饰Shape对象
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
小结
根据以上案例,我们就实现了扩展Shape功能。这种设计模式在工作中,我也没有遇到过,可能现在理解到了,但是不一定会使用,在此记录一下,相信我以后可能会用到的。