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

装饰器模式

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

图解

角色

  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 复制代码
画一个三角形,并填充颜色:
画了一个三角形
并填充颜色
画一个圆形,并填充颜色,在加粗字体:
画了一个圆形
并填充颜色
并加粗了字体
相关推荐
拼搏@1 小时前
第十六天,7月10日,八股
java·mybatis
Sylvia-girl4 小时前
Java——抽象类
java·开发语言
Touper.7 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
m0_535064607 小时前
C++模版编程:类模版与继承
java·jvm·c++
虾条_花吹雪8 小时前
Using Spring for Apache Pulsar:Message Production
java·ai·中间件
tomorrow.hello8 小时前
Java并发测试工具
java·开发语言·测试工具
Moso_Rx8 小时前
javaEE——synchronized关键字
java·java-ee
张小洛9 小时前
Spring AOP 是如何生效的(入口源码级解析)?
java·后端·spring
DKPT9 小时前
Java设计模式之行为型模式(观察者模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
追风少年浪子彦9 小时前
mapstruct与lombok冲突原因及解决方案
java·spring boot·spring·spring cloud