当前位置: 首页 > article >正文

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

目录

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 {

	@Override
	public void methodOne() {
		System.out.println("前进100米");
	}

	@Override
	public 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;
	}

	@Override
	public abstract void methodOne();

	@Override
	public abstract void methodTwo();

}

具体装饰A

package xyz.jangle.design.decorator;

public class ConcreteDecoratorA extends Decorator {

	public ConcreteDecoratorA(Component component) {
		super(component);
	}

	@Override
	public void methodOne() {
		component.methodOne();
		otherMethod();
	}

	@Override
	public 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);
	}

	@Override
	public void methodOne() {
		component.methodOne();
		otherMethod();
	}

	@Override
	public 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.kler.cn/a/406460.html

相关文章:

  • C# .NET环境下调用ONNX格式YOLOV8模型问题总结
  • Windows VScode+Latex环境
  • Jvm知识点
  • Java NIO 核心知识总结
  • LeetCode 746. 使用最小花费爬楼梯 java题解
  • 电子电气架构 ---漫谈车载网关
  • 如何修复WordPress卡在维护模式
  • 适配屏幕px、rem单位换算, 将 pxToRem 函数设置为一个全局工具如:在 utils.js 文件、SCSS/Mixin 定义
  • 外卖系统开发实战:从架构设计到代码实现
  • Docker 容器自动启动设置
  • XCode Build时遇到 .entitlements could not be opened 的问题
  • 在 IDEA 中关闭 Spark 的日志输出 已解决
  • JVM(五、垃圾回收器)
  • 初级数据结构——树
  • Element-UI中el-input输入手机号时,如何限制只能输入数字
  • django基于Django的二手电子设备交易平台设计与开发
  • 服务机器人三甲坎德拉:用智能化开启售后服务新篇章
  • 使用OpenAI进行自动化报告和数据解读
  • 【spark】远程debug spark任务(含有pyspark)
  • 接口测试和单元测试
  • ChatClient:探索与AI模型通信的Fluent API
  • VITE 忽略指定路径的资源
  • 医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室
  • 一线大厂面试集锦
  • 【Linux】环境搭建Qwen2-VL-7B模型(图文详解-成果案例)
  • linux搭建Gray