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

目录

0、定义

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

2、装饰模式的UML类图

3、示例代码


0、定义

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

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

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

2、装饰模式的UML类图

3、示例代码

抽象组件

java 复制代码
package xyz.jangle.design.decorator;

public abstract class Component {
	
	public abstract void methodOne();
	
	public abstract void methodTwo();
}

具体组件

java 复制代码
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米");
	}

}

装饰

java 复制代码
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

java 复制代码
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

java 复制代码
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米");
	}

}

客户端(使用)

java 复制代码
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();

	}

}

输出结果:

bash 复制代码
前进100米
----------------
前进100米
再前进50米
----------------
前进200米
再前进50米
再前进150米
相关推荐
feasibility.2 分钟前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon28 分钟前
七大设计原则介绍
设计模式
YigAin3 小时前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业16 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑20 小时前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲1 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头1 天前
设计模式与C语言高级特性的结合
c语言·设计模式
小温冲冲1 天前
通俗且全面精讲单例设计模式
开发语言·javascript·设计模式
Vivienne_ChenW1 天前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
sg_knight1 天前
原型模式(Prototype)
python·设计模式·开发·原型模式