• ​JAVA设计模式(十)——装饰模式


    下图为所有设计模式,带标记为重点掌握以及工作中常用到的:
    在这里插入图片描述
      装饰模式属于结构型模式之一,其作用是向一个现有的对象添加新的功能,同时又不改变其结构,有点我们Spring中AOP的意思。

    模式名称优点缺点应用场景
    装饰模式装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。多层装饰比较复杂1、扩展一个类的功能。
    2、动态增加功能,动态撤销

    注意事项:装饰模式作用是扩展一个类,因此是可以代替继承的。

    装饰模式

    1、创建一个形状接口
    public interface Shape {
       void draw();
    }
    
    • 1
    • 2
    • 3
    2、创建两个形状接口的实现类,长方形和圆形
    public class Rectangle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Shape: Rectangle");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    public class Circle implements Shape {
     
       @Override
       public void draw() {
          System.out.println("Shape: Circle");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3、创建实现了形状接口的抽象装饰类
    public abstract class ShapeDecorator implements Shape {
       protected Shape decoratedShape;
     
       public ShapeDecorator(Shape decoratedShape){
          this.decoratedShape = decoratedShape;
       }
     
       public void draw(){
          decoratedShape.draw();
       }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    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");
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    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();
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    小结

    根据以上案例,我们就实现了扩展Shape功能。这种设计模式在工作中,我也没有遇到过,可能现在理解到了,但是不一定会使用,在此记录一下,相信我以后可能会用到的。

  • 相关阅读:
    CM46 合法括号序列判断 - 题解
    Docker容器化技术
    黄石市2022年知识产权质押贷款贴息补贴项目申报条件、材料
    Redis
    Linux- 自定义一个ARP请求
    太空射击 第07课: 添加图形
    lightdb 支持兼容Oracle的to_clob函数
    git硬重置(hard reset)重找回
    JavaEE——Session会话追踪的实现机制
    分库分表与sharding-jdbc
  • 原文地址:https://blog.csdn.net/lingerlan510/article/details/126580978