设计模式:6、装饰模式(包装器)

devtools/2024/11/23 19:50:51/

目录

0、定义

1、装饰模式包含的四种角色

2、装饰模式的UML类图

3、示例代码


0、定义

        动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。

1、装饰模式包含的四种角色

  • 抽象组件(Component):抽象组件是一个抽象类。抽象组件定义了“被装饰者”需要进行“装饰”的方法。
  • 具体组件(ConcreteComponent):具体组件抽象组件的一个子类,具体组件的实例称作“被装饰者”
  • 装饰(Decorator):装饰也是抽象组件的一个子类,但装饰还包含一个抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是抽象类也可以是一个非抽象类,如果是非抽象类,那么该类的实例称作“装饰者”。
  • 具体装饰(ConcreteDecorator):具体装饰装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。

2、装饰模式的UML类图

3、示例代码

抽象组件

package xyz.jangle.design.decorator;public abstract class Component {public abstract void methodOne();public abstract void methodTwo();
}

具体组件

package xyz.jangle.design.decorator;public class ConcreteComponent extends Component {@Overridepublic void methodOne() {System.out.println("前进100米");}@Overridepublic void methodTwo() {System.out.println("前进200米");}}

装饰

package xyz.jangle.design.decorator;public abstract class Decorator extends Component {protected Component component;public Decorator(Component component) {super();this.component = component;}@Overridepublic abstract void methodOne();@Overridepublic abstract void methodTwo();}

具体装饰A

package xyz.jangle.design.decorator;public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void methodOne() {component.methodOne();otherMethod();}@Overridepublic void methodTwo() {component.methodTwo();otherMethod();}public void otherMethod() {System.out.println("再前进50米");}}

具体装饰B

package xyz.jangle.design.decorator;public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void methodOne() {component.methodOne();otherMethod();}@Overridepublic void methodTwo() {component.methodTwo();otherMethod();}public void otherMethod() {System.out.println("再前进150米");}}

客户端(使用)

package xyz.jangle.design.decorator;public class AppMain6 {public static void main(String[] args) {ConcreteComponent component = new ConcreteComponent();	// 创建具体组件component.methodOne();System.out.println("----------------");ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(component);	//装饰具体组件decoratorA.methodOne();System.out.println("----------------");ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(decoratorA);	//在装饰上再进行装饰decoratorB.methodTwo();}}

输出结果:

前进100米
----------------
前进100米
再前进50米
----------------
前进200米
再前进50米
再前进150米


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

相关文章

设计模式之 责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将多个处理对象通过链式结构连接起来,形成一条处理请求的链条。每个处理对象都有机会处理请求,或者将请求传递给链中的下一个对象。这样&#x…

接口上传视频和oss直传视频到阿里云组件

接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…

Pytorch使用手册-Tensors(专题二)

这段代码是对 PyTorch 中张量(Tensors)的详细介绍和操作演示。以下是逐步讲解: 1. 什么是张量 (Tensor) 张量是一种专门的数据结构,与 NumPy 的多维数组(ndarray)类似: 它可以在 GPU 或其他硬件加速器上运行。张量可以与 NumPy 共享内存,避免不必要的数据拷贝。它是为…

基于 DRNN 神经网络整定的 PID 解耦控制

1. 基本原理 DRNN&#xff08;Dynamic Recurrent Neural Network, 动态递归神经网络&#xff09;是一种带有时间反馈的神经网络&#xff0c;能够建模系统的动态特性&#xff0c;适用于非线性、多变量、时变系统的控制。结合 PID 解耦控制&#xff0c;利用 DRNN 进行动态建模和…

VITE 忽略指定路径的资源

前言 问题起因是因为项目需要引入服务器端的网络图片 而在编写配置时发现&#xff0c;Vite并不支持排除指定前缀的资源 唯一可以排外的只有 Rollup 的 external 选项可以排除外部依赖&#xff0c;但他只能排除外部依赖&#xff0c;不支持指定路径资源或指定前缀的资源&#…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

FreeRTOS:事件标志组与任务通知

目录 一、事件标志组&#xff08;Event Groups&#xff09; 1、事件标志组的特点 2、事件标志组与队列、信号量的区别 3、关键API函数 4、示例代码 5、优缺点 6、总结 二、任务通知&#xff08;Task Notifications&#xff09; 1、任务通知的特点 2、关键API函数 3、…