Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >装饰模式

装饰模式

作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-01-25 08:45:19
发布于 2019-01-25 08:45:19
50800
代码可运行
举报
运行总次数:0
代码可运行

装饰模式是一种用于替代继承的技术,它通过一种无需定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入装饰类,在装饰类中即可以调用被装饰类的方法,还可以定义新的方法,以便扩充类的功能。装饰模式降低了系统的耦合度,可以动态增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,增加新的具体构件类和具体装饰类都非常方便。

装饰模式(Decorator Pattern)定义:动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以成为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。

英文定义:Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionlity.

装饰模式的结构可用如下UML类图表示:

装饰模式包含如下的角色:

⑴Component(抽象构件)

抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法)。抽象构件是具体构件和抽象修饰类的共同父类,它声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被修饰的对象以及装饰之后的对象,实现客户端的透明操作。

⑵ConcreteComponent(具体构件)

具体构件定义了具体的构件对象,实现了再抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。

⑶Decorator(抽象装饰类)

抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。

⑷ConcreteDecorator(具体装饰类)

具体装饰类是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法以便扩充对象的行为。

下面我们来看一个实例:

抽象构件类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tzy.wrapper;

public interface Component {
	public void doSomething();
}

具体构件类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tzy.wrapper;

public class ConcreteComponent implements Component {

	@Override
	public void doSomething() {
		System.out.println("我实现了功能A!");
	}

}

装饰类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tzy.wrapper;

public class Decorator implements Component {
	private Component component;
	
	public Decorator(Component component) {
		this.component = component;
	}

	@Override
	public void doSomething() {
		component.doSomething();
	}

}

具体装饰类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tzy.wrapper;

public class ConcreteDecorator extends Decorator{

	public ConcreteDecorator(Component component) {
		super(component);
	}
	private void doAnotherthing() {
		System.out.println("我实现了功能B!");
	}
	@Override
	public void doSomething() {
		super.doSomething();
		this.doAnotherthing();
	}
	
}

测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tzy.wrapper;

public class Client {
	public static void main(String[] args) {
		Component component = new ConcreteDecorator(new ConcreteComponent());
		component.doSomething();
	}
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
我实现了功能A!
我实现了功能B

Java IO中大量使用了装饰模式,可参考我的博文:Java IO的装饰模式

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年01月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式之装饰者模式
定义:装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。
关忆北.
2022/05/05
1780
Java IO 装饰者模式
  装饰模式以对客户端透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。
intsmaze-刘洋
2018/08/29
4580
Java IO 装饰者模式
设计模式~装饰模式
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
Vincent-yuan
2020/08/20
3060
人靠衣装,美靠靓装——装饰模式,让你成为最靓的仔!
成都的气温说降就降啊!还没立冬呢,温度骤然下降,只有10度了。扛不住了,Jungle要穿一件毛衣!额,出门还是很冷!那再带个围巾!天,上半身不冷了,下半身还那么冷~~~穿上秋裤!出门前想了想,这种天气骑摩拜单车一定吹着手冷,于是Jungle又带上了手套……
用户6557940
2022/07/24
3380
人靠衣装,美靠靓装——装饰模式,让你成为最靓的仔!
一起学习设计模式--10.装饰模式
尽管目前房价依然在涨,但依旧阻止不了大家对新房的渴望和买房的热情。如果大家买的是毛坯房,还要面临一个艰巨的任务,那就是装修。对于新房进行装修,并没有改变房屋用于居住的本质,但是它可以让房子变得更漂亮、更温馨、更实用、更能满足居家需求。在软件设计中,也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能。这种技术对应于一种被称之为装饰模式的设计模式。
独立观察员
2022/12/06
5040
一起学习设计模式--10.装饰模式
Java设计模式(七)----装饰模式
装饰模式 一、概述 二、装饰模式的结构 三、具体案列 四、装饰模式与类继承的区别 五、装饰模式的特点: 六、装饰模式、适配器模式、代理模式区别 一、概述 1.装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 2.装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉
汤高
2018/01/11
8770
Java设计模式(七)----装饰模式
设计模式(八):装饰模式
设计模式(八):装饰模式
Java架构师必看
2021/05/14
2720
装饰模式,不难!
1. 装饰模式概述 2. 装饰模式的结构与实现 3. 装饰模式的应用实例 4. 透明装饰模式与半透明装饰模式 5. 装饰模式的优缺点与适用环境 “Github:https://github.com/nateshao/design-demo/tree/main/JavaDesignPatterns/12-decorator 1. 装饰模式概述 现实生活中的“装饰”实例 装饰模式分析 可以在不改变一个对象本身功能的基础上给对象增加额外的新行为 是一种用于替代继承的技术,它通过一种无须定义子类的方式给
千羽
2021/12/29
4990
装饰模式,不难!
Java设计模式之装饰模式
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰者与被装饰者拥实现了共同的接口。
程裕强
2022/05/06
1600
设计模式(二) 打车装饰模式
装饰模式又叫包装模式。装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
用户1518699
2019/07/16
4140
设计模式(二)  打车装饰模式
Java面向对象设计之装饰模式
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
Abalone
2022/07/14
4270
Java面向对象设计之装饰模式
装饰器模式(Decorator)
装饰器模式(Decorator) 对客户透明的方式动态地给一个对象附加上更多的责任,同时又不改变其结构。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。 类图: 1.抽象构件(Comp
qubianzhong
2019/07/01
4360
设计模式(五)——装饰器
在装饰模式中, 必然有一个最基本、 最核心、 最原始的接口或抽象类充当 Component抽象构件。
小森啦啦啦
2019/07/13
2680
Java描述设计模式(09):装饰模式
一、生活场景 1、场景描述 孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成鸟儿时,就可以在天上飞行。 2、场景图解 3、代码实现 public
知了一笑
2019/09/03
4160
Java描述设计模式(09):装饰模式
详解设计模式:装饰器模式
装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。
栗筝i
2022/12/02
3990
详解设计模式:装饰器模式
Java设计模式之(七)——装饰器模式
装饰器模式(Decorator Pattern):动态的给一个对象添加额外的职责,就增加功能来说, 装饰模式相比生成子类更为灵活。
IT可乐
2021/11/25
3550
人要衣装,佛要金装之装饰模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
BUG弄潮儿
2021/01/18
3100
人要衣装,佛要金装之装饰模式
一天一个设计模式:装饰者模式
装饰者模式又称为包装(wrapper)模式。装饰者模式对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
用户1134788
2018/12/07
6760
Java装饰者模式(decorator)
  装饰者模式又称为包装模式(Wrapper),作用是用来动态的为一个对象增加新的功能。装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
用户4919348
2019/04/02
3270
Java装饰者模式(decorator)
设计模式—— 十七:装饰器模式
● Component(抽象构件) 抽象构件它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。
三分恶
2020/07/16
1.1K0
相关推荐
设计模式之装饰者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验