设计模式: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米
相关推荐
越甲八千1 小时前
重温设计模式--享元模式
设计模式·享元模式
码农爱java2 小时前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式
越甲八千3 小时前
重温设计模式--中介者模式
windows·设计模式·中介者模式
犬余3 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
Theodore_10224 小时前
1 软件工程——概述
java·开发语言·算法·设计模式·java-ee·软件工程·个人开发
越甲八千6 小时前
重拾设计模式--组合模式
设计模式·组合模式
思忖小下9 小时前
梳理你的思路(从OOP到架构设计)_设计模式Composite模式
设计模式·组合模式·eit
机器视觉知识推荐、就业指导9 小时前
C++设计模式:组合模式(公司架构案例)
c++·后端·设计模式·组合模式
越甲八千9 小时前
重拾设计模式--工厂模式(简单、工厂、抽象)
c++·设计模式
重生之绝世牛码11 小时前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式