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

装饰器模式

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

图解

角色

  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 复制代码
画一个三角形,并填充颜色:
画了一个三角形
并填充颜色
画一个圆形,并填充颜色,在加粗字体:
画了一个圆形
并填充颜色
并加粗了字体
相关推荐
毕设源码-朱学姐7 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
C雨后彩虹9 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
java1234_小锋10 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试
2501_9445255410 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐10 小时前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
Filotimo_10 小时前
Tomcat的概念
java·tomcat
索荣荣11 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
Amumu1213811 小时前
Vue Router(二)
java·前端
念越11 小时前
数据结构:栈堆
java·开发语言·数据结构