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

devtools/2024/9/22 19:07:00/

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

  • 1. 装饰者模式的介绍
  • 2. 装饰者模式的类图
  • 3. 装饰者模式的实现
    • 3.1 创建一个抽象组建Chef
    • 3.2 创建两个具体组件ChineseChef和EuropeanChef
    • 3.3 创建抽象装饰器ChefDecorator
    • 3.4 创建具体装饰器PlateChefDecorator
    • 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 {@Overridepublic void cook() {System.out.println("制作中餐");}
}
java">package blog;/*** 西方厨师*/
public class EuropeanChef implements Chef{@Overridepublic 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);}@Overridepublic 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();}
}

http://www.ppmy.cn/devtools/28791.html

相关文章

python gmssl SM4不填充加解密

问题描述 使用gmssl(python版本)进行SM4加/解密时结果与国标(GMT0002)不符,或解密失败,原因是gmssl默认使用PKCS7填充,国标文档里的样例是没有填充的。 解决方法 方法一:创建CryptSM4对象时将填充模式设为-1。这是笔者推荐的方法…

GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系 本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。 GPU 硬件基础概念GP…

Linux内核之原子操作:atomic_long_dec用法实例(六十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

爬虫学习--1.前导知识

初始爬虫 前言引入 随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。 我们感兴趣的信息分为不同的类型:如果只是做…

踩坑Mybatis + Mybatis-plus + MyBatis-plus-join

数据库里有两张表 tb_bursary和tb_student --tb_bursaryCREATE TABLE tb_bursary (id int(11) NOT NULL AUTO_INCREMENT,student_id int(11) NOT NULL,bursary int(11) NOT NULL,is_approve char(1) NOT NULL DEFAULT 0,approver varchar(50) DEFAULT NULL,approve_datetime …

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

On evaluating adversarial robustness of large vision language models - 论文翻译

论文链接:https://arxiv.org/pdf/2305.16934 项目代码:https://github.com/yunqing-me/AttackVLM On evaluating adversarial robustness of large vision language models Abstract1 Introduction2 Related work3 Methodology3.1 Preliminary3.2 Transf…

k8s如何写yaml文件

k8s&&如何写yaml文件 metadataspecresources: 如何设置request和limit? status metadata metadata: 通常用于填写一些对象(如pod、deployment等)的描述信息(类似人的名字、年龄等)。 spec spec: 通常代表着…