Java设计模式 —— 装饰模式
12 装饰模式
12.1 装饰模式概述
Decorator Pattern: 动态地给一个对象增加一些额外的职责。提供一种比使用子类更加灵活的方案来扩展功能。
装饰模式是一种用于替代继承的技术,通过一种无须定义子类的方式给对象动态增加职责,使用对象之间的关联关系替代类之间继承关系。
装饰模式结构图如下所示:

12.2 装饰模式实现
12.2.1 抽象构件类
它是具体构件类和抽象装饰类的共同父类,它的引入使得客户端可以以一致的方式处理未装饰的对象和已装饰的对象,实现客户端的透明操作。
public abstract class Component {
public abstract void operation();
}
12.2.2 具体构件类
实现抽象构件中声明的方法,装饰类可以给它增加额外的方法。
public class ConcreteComponent extends Component {
public void operation() {
// 业务代码
}
}
12.2.3 抽象装饰类
用于给具体构件类增加职责,但是具体增加的职责在其子类中实现。
public class Decorator extends Component {
private Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation() {
// 调用原有业务方法
component.operation();
}
}
12.2.4 具体装饰类
负责向具体构件中添加新的职责。
public class ConcreteDecorator extends Decorator {
public concreteDecorator(Component component) {
super(component);
}
public void operation() {
super.operation();
// 新增的职责
addMethod();
}
public void addMethod() {
// 新增职责逻辑
}
}
12.2.5 客户端调用
public class Client {
public static void main(String[] args) {
Component component, decorator;
component = new ConcreteComponent();
decorator = new ConcreteDecorator(component);
// 一致的方式处理未装饰的对象和已装饰的对象
componet.operation();
decorator.operation();
}
}
12.3 透明装饰模式与半透明装饰模式
12.3.1 透明装饰模式
上述装饰模式的实现即为透明装饰模式,要求客户端完全针对抽象编程。装饰模式的透明性要求客户端程序将对象声明为抽象构件类型,可以一致的处理装饰对象和未装饰对象。
但是在某些情况下,有些新增行为需要单独被调用,此时如果使用透明装饰模式,则无法一致的处理装饰前的对象和装饰后的对象(装饰后的对象需要强制类型转换调用新增行为)。
12.3.2 半透明装饰模式
为了能够调用到新增的方法,不得不用具体装饰类型来定义装饰之后的对象,而具体构件对象可以使用抽象构件声明,这种装饰模式则称为半透明。
public class Client {
Component component;
component = new ConcreteComponent();
component.operation();
ConcreteDecorator decorator = new ConcreteDecorator(component);
decorator.operation();
decorator.addMethod();
}
半透明模式可以给系统带来更多的灵活性,使用起来也非常方便;但是其缺点是客户端需要区别的对象装饰对象和未装饰对象。
12.4 装饰模式优/缺点
使用场景:Java I/O 输入流和输出流
装饰模式的优点主要如下:
- 对于扩展一个类的功能,装饰模式比继承更加灵活
- 可以对一个对象进行多次装饰,通过使用不同的装饰类得到功能更强大的对象
- 具体构件类和具体装饰类可以独立变化,用户根据需要增加新的构件类和装饰类,无须修改原有代码,符合开闭原则
装饰模式的缺点主要如下:
- 装饰模式提供了一种比继承更灵活的方式,同时也比继承更加易于出错,排错也更加困难,对于多次装饰的对象
Java设计模式 —— 装饰模式的更多相关文章
- Java设计模式---装饰模式
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...
- Java设计模式-装饰模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...
- Java设计模式—装饰模式
装饰模式是一种比较常见的模式. 定义为:动态的给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活. 装饰模式的通用类图如下: 装饰模式的构成: 1) 抽象构件(Component ...
- Java设计模式——装饰模式
转载自:http://blog.csdn.net/xu__cg/article/details/53024490 抽象构件 public interface CarInterface { void m ...
- Java设计模式学习记录-装饰模式
前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一 ...
- Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
随机推荐
- 第13章 MVC和Razor Pages过滤器管道(ASP.NET Core in Action, 2nd Edition)
本章包括 过滤器管道及其与中间件的区别 创建自定义筛选器以重构复杂的操作方法 使用授权筛选器保护您的操作方法和Razor页面 短路筛选器管道以绕过操作和页面处理程序执行 将依赖项注入筛选器 在第1部分 ...
- 第14章 身份验证:使用Identity将用户添加到应用程序(ASP.NET Core in Action, 2nd Edition)
本章包括 ASP.NET Core中web应用程序的身份验证工作原理 使用ASP.NET Core标识系统创建项目 向现有web应用添加用户功能 自定义默认ASP.NET Core标识UI 像ASPN ...
- PVE设置定时关闭、启动虚拟机
shell中输入命令: crontab -e 进入对应cron 添加命令: 例如: 00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop 00 ...
- intellij idea中怎么没有git版本控制设置项
在使用intellij idea的时候想要使用git进行版本控制,但是在设置项和界面没有发现相关内容,怎么回事呢? 我们先打开电脑,从桌面的快捷方式打开intellij idea,进入到intelli ...
- Jmeter检查点
一.Response Assertion(响应断言) 1. 添加响应断言 对Web请求的响应结果进行验证,Response Assertion配置参数 2. 输入需要匹配的字符串 此处对于访问Baid ...
- 洛谷P1118数字三角形,
#include <bits/stdc++.h> using namespace std; int c[13][13];//杨辉三角 int b[13];//用于排除 int a[13]; ...
- 量化交易-可视化展示(grafana)
先上图 简单的实现了一下,效果还好,可玩性强 大概部署mysql+grafana step 1: 服务器:阿里云,ucloud啥的随意,配置也不需要什么,我的是阿里云1核1GB,足以 我用的ubunt ...
- Navicat 通过ssh链接远程数据库
首先需要下载一个Navicat数据库管理工具,有了Navicat工具需要完成一下步骤就可以实现本地链接远程数据库了 一.打开Navicat,点击连接按钮,找到MySQL并点击 二.点击"常规 ...
- Spyglass CDC工具使用(四)
最近一直在搞CDC (clock domain crossing) 方面的事情,现在就CDC的一些知识点进行总结. 做CDC检查使用的是Spyglass工具.以下内容转载自:Spyglass之CDC检 ...
- CentOS基本命令手册
一.磁盘使用情况 两个命令df .du结合比较直观 df -h #查看整台服务器的硬盘使用情况 du -sh * #查看每个文件夹的大小 二.tar 用法 压缩 tar tar -czvf test. ...