设计模式(十):装饰者模式

设计模式(十):装饰者模式

  • [1. 装饰者模式的介绍](#1. 装饰者模式的介绍)
  • [2. 装饰者模式的类图](#2. 装饰者模式的类图)
  • [3. 装饰者模式的实现](#3. 装饰者模式的实现)
    • [3.1 创建一个抽象组建Chef](#3.1 创建一个抽象组建Chef)
    • [3.2 创建两个具体组件ChineseChef和EuropeanChef](#3.2 创建两个具体组件ChineseChef和EuropeanChef)
    • [3.3 创建抽象装饰器ChefDecorator](#3.3 创建抽象装饰器ChefDecorator)
    • [3.4 创建具体装饰器PlateChefDecorator](#3.4 创建具体装饰器PlateChefDecorator)
    • [3.5 测试](#3.5 测试)

1. 装饰者模式的介绍

装饰器模式(Decorator Pattern)属于结构型模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。

装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。

装饰器模式包含四个核心角色:

  • 抽象组件(Component):定义了原始对象和装饰器对象的公共接口或抽象类,可以是具体组件类的父类或接口。
  • 具体组件(Concrete Component):是被装饰的原始对象,它定义了需要添加新功能的对象。
  • 抽象装饰器(Decorator):继承自抽象组件,它包含了一个抽象组件对象,同时可以通过组合方式持有其他装饰器对象。
  • 具体装饰器(Concrete Decorator):实现了抽象装饰器的接口,负责向抽象组件添加新的功能。具体装饰器通常会在调用原始对象的方法之前或之后执行自己的操作。

2. 装饰者模式的类图

3. 装饰者模式的实现

3.1 创建一个抽象组建Chef

java 复制代码
package blog;

/**
 * 厨师
 */
public interface Chef {
    void cook();
}

3.2 创建两个具体组件ChineseChef和EuropeanChef

java 复制代码
package blog;

/**
 * 中国厨师
 */
public class ChineseChef implements Chef {

    @Override
    public void cook() {
        System.out.println("制作中餐");
    }
}
java 复制代码
package blog;

/**
 * 西方厨师
 */
public class EuropeanChef implements Chef{
    @Override
    public void cook() {
        System.out.println("制作西餐");
    }
}

3.3 创建抽象装饰器ChefDecorator

java 复制代码
package blog;

/**
 * 厨师装饰器
 */
public abstract class ChefDecorator implements Chef {
    protected Chef chef;

    public ChefDecorator(Chef chef) {
        this.chef = chef;
    }
}

3.4 创建具体装饰器PlateChefDecorator

java 复制代码
package blog;

/**
 * 厨师摆盘装饰器
 */
public class PlateChefDecorator extends ChefDecorator{
    public PlateChefDecorator(Chef chef) {
        super(chef);
    }

    @Override
    public void cook() {
        chef.cook();
        plate();
    }

    private void plate() {
        if (chef instanceof ChineseChef) {
            System.out.println("中式摆盘");
        } else {
            System.out.println("西式摆盘");
        }
    }
}

3.5 测试

java 复制代码
package blog;

public class DecoratorDemo {
    public static void main(String[] args) {
        ChineseChef chineseChef = new ChineseChef();
        PlateChefDecorator plateChineseChef = new PlateChefDecorator(chineseChef);
        plateChineseChef.cook();

        EuropeanChef europeanChef = new EuropeanChef();
        PlateChefDecorator plateEuropeanChef = new PlateChefDecorator(europeanChef);
        plateEuropeanChef.cook();

    }
}
相关推荐
爱编程的鱼10 分钟前
OpenCV Python 绑定:原理与实战
c语言·开发语言·c++·python
这周也會开心17 分钟前
云服务器安装JDK、Tomcat、MySQL
java·服务器·tomcat
hrrrrb1 小时前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶1 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
sdgsdgdsgc1 小时前
Next.js企业级应用开发:SSR、ISR与性能监控方案
开发语言·前端·javascript
周杰伦_Jay2 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
rit84324995 小时前
基于MATLAB的模糊图像复原
开发语言·matlab
fie88895 小时前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能
程序员小凯6 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵6 小时前
基本数据类型
java·算法