设计模式: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米
相关推荐
pengyu13 分钟前
【Java设计原则与模式之系统化精讲:零】 | 编程世界的道与术(理论篇)
java·后端·设计模式
hstar95271 小时前
三十三、面向对象底层逻辑-SpringMVC九大组件之HandlerExceptionResolver接口设计
java·spring·设计模式·架构
摘星编程9 小时前
抽象工厂模式深度解析:从原理到与应用实战
设计模式·抽象工厂模式·源码分析·软件架构·实战案例
季鸢18 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
蔡蓝18 小时前
设计模式-迪米特法则
设计模式·log4j·迪米特法则
Gixy1 天前
聊聊纯函数与不可变数据结构
前端·设计模式
Java菜鸟、1 天前
设计模式(代理设计模式)
java·开发语言·设计模式
何中应1 天前
【设计模式-3.7】结构型——组合模式
java·设计模式·组合模式
magic 2451 天前
Java设计模式之观察者模式详解
观察者模式·设计模式
秋田君1 天前
深入理解JavaScript设计模式之闭包与高阶函数
开发语言·javascript·设计模式