设计模式-装饰器模式(结构型)

装饰器模式

装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。

图解

角色

  1. 抽象组件:定义组件的抽象方法
  2. 具体组件:实现组件的抽象方法
  3. 抽象装饰器:实现抽象组件接口,聚合具体组件
  4. 具体装饰器:定义装饰方法,重写抽象组件的抽象方法,并在方法内调用具体组件的方法实现和装饰方法

代码示例

抽象组件:

java 复制代码
public interface Shape {
    void paint();
}

具体组件:

java 复制代码
public class Rotundity implements Shape {
    @Override
    public void paint() {
        System.out.println("画了一个圆形");
    }
}

public class Triangle implements Shape{
    @Override
    public void paint() {
        System.out.println("画了一个三角形");
    }
}

抽象装饰器

java 复制代码
public abstract class ShapeDecorator implements Shape{
    protected Shape shape;

    public ShapeDecorator(Shape shape) {
        this.shape = shape;
    }
}

具体装饰器

java 复制代码
/** 颜色装饰*/
public class ColorDecorator extends ShapeDecorator{
    public ColorDecorator(Shape shape) {
        super(shape);
    }
    @Override
    public void paint() {
        shape.paint();
        filling();
    }
    private void filling(){
        System.out.println("并填充颜色");
    }
}
/** 字体装饰*/
public class FontDecorator extends ShapeDecorator{
    public FontDecorator(Shape shape) {
        super(shape);
    }

    @Override
    public void paint() {
        shape.paint();
        changePaint();
    }
    public void changePaint(){
        System.out.println("并加粗了字体");
    }
}

使用

java 复制代码
public class Test {
    public static void main(String[] args) {
        Shape triangle = new Triangle();
        Shape rotundity = new Rotundity();
        Shape triangleColorDecorator = new ColorDecorator(triangle);
        Shape rotundityColorDecorator = new ColorDecorator(rotundity);
        System.out.println("画一个三角形,并填充颜色:");
        triangleColorDecorator.paint();
        System.out.println("画一个圆形,并填充颜色,在加粗字体:");
        FontDecorator fontDecorator = new FontDecorator(rotundityColorDecorator);
        fontDecorator.paint();
    }
}
shell 复制代码
画一个三角形,并填充颜色:
画了一个三角形
并填充颜色
画一个圆形,并填充颜色,在加粗字体:
画了一个圆形
并填充颜色
并加粗了字体
相关推荐
Patrick在香港6 分钟前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术17 分钟前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫27 分钟前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话35 分钟前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠1 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个2 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-3 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发4 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh5 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java
计科土狗5 小时前
GESP六级专题之类与对象
java·前端·数据库