装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构
意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
主要解决: 一般的,我们为了扩展一个类经常使用继承方式实现,并且随着扩展功能的增多,子类会很膨胀。
何时使用: 在不想增加很多子类的情况下扩展类。
应用实例: 1、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。
优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点: 多层装饰比较复杂。
使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
注意事项: 可代替继承。
案例 : 我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
接口(画)
public interface Shape {
void draw();
}
接口实现类(圆形)
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: 圆形");
}
}
接口实现类(矩形)
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: 矩形");
}
}
创建实现了 Shape 接口的抽象装饰类。
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
@Override
public void draw(){
decoratedShape.draw();
}
}
创建扩展的实体装饰类。
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();//原方法
setRedBorder();//扩展
}
private void setRedBorder(){
System.out.println("Border Color: Red");
}
}
测试
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape rectangle=new Rectangle();
System.out.println("----------------未装饰的-----------------");
circle.draw();
System.out.println();
rectangle.draw();
Shape redCircle = new RedShapeDecorator(circle);
Shape redRectangle = new RedShapeDecorator(rectangle);
System.out.println("-------------装饰后的的-----------------");
redCircle.draw();
System.out.println();
redRectangle.draw();
}
}
----------------未装饰的-----------------
Shape: 圆形
Shape: 矩形
-------------装饰后的的-----------------
Shape: 圆形
Border Color: Red
Shape: 矩形
Border Color: Red
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120239138
内容来源于网络,如有侵权,请联系作者删除!