第13章 装饰模式 Deng Song daonicool@sina.com.

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

Decorator pattern Leader : Jiankang Gong Member : Xuanya Jiao Jiahong Chen Jiajian Shi Zhen Du lulu Han Tian Han.
面向侧面的程序设计 方林博士 本文下载地址:
高级服务器设计和实现 1 —— 基础与进阶 余锋
第17章 职责链模式 Deng Song
第16章 代理模式 Website:
Tool Command Language --11级ACM班 金天行.
第14章 c++中的代码重用.
第八章 分析與設計階段 – 物件導向設計(OOD)
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
第10讲 Java面向对象编程基础(4) 教学目标 主要内容.
第9章 单例模式 Website:
第九章 字符串.
外观模式.
Design Pattern (2) 设计模式(2) Institute of Computer Software 2018/9/21
Design Patterns Lecture 3.
SVN的基本概念 柳峰
面向对象建模技术 软件工程系 林 琳.
软件建模训练(7) 设计模式 张静 南京理工大学计算机科学与工程学院.
职责链模式.
走进编程 程序的顺序结构(二).
辅导课程六.
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
桥接模式.
组合模式.
应用实例 识别Ps & Pt ADTS 压力通道并校验 CPD8000 New MENSOR‘s ADTS: CPA8001.
Windows 7 的系统设置.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
简单工厂模式.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第14章 外观模式 Deng Song
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
第11章 桥接模式 Deng Song
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
顺序表的删除.
C#面向对象程序设计 $6 深入理解类.
第12章 组合模式 Deng Song
VisComposer 2019/4/17.
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
Aspect Oriented Programming
实验七 安全FTP服务器实验 2019/4/28.
抽象工厂模式.
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 18 使用GRASP的对象设计示例.
第7章 建造者模式 Deng Song
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
辅导课程十五.
Delphi 7.0开发示例.
第二章 Java基本语法 讲师:复凡.
Python 环境搭建 基于Anaconda和VSCode.
CMP 讲义 2018 CMP设计哲学及基础概念 CMP推荐的4层代码结构.
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
JAVA 程式設計與資料結構 第三章 物件的設計.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
Summary
Presentation transcript:

第13章 装饰模式 Deng Song daonicool@sina.com

本章教学内容 装饰模式 模式动机与定义 模式结构与分析 模式实例与解析 模式效果与应用 模式扩展

装饰模式 模式动机

装饰模式 模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机。 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰器(Decorator)。

装饰模式 模式动机 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。

装饰模式 模式定义 装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。

装饰模式 模式定义 Decorator Pattern: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. Frequency of use: medium

装饰模式 模式结构

装饰模式 模式结构 装饰模式包含如下角色: Component: 抽象构件 ConcreteComponent: 具体构件 Decorator: 抽象装饰类 ConcreteDecorator: 具体装饰类

装饰模式 模式分析 与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系要创建更多的对象。 使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。

装饰模式 模式分析 典型的抽象装饰类代码: public class Decorator extends Component { private Component component; public Decorator(Component component) this.component=component; } public void operation() component.operation();

装饰模式 模式分析 典型的具体装饰类代码: public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) super(component); } public void operation() super.operation(); addedBehavior(); public void addedBehavior() //新增方法

装饰模式 装饰模式实例与解析 实例一:变形金刚 变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。

装饰模式 装饰模式实例与解析 实例一:变形金刚

装饰模式 装饰模式实例与解析 实例一:变形金刚 参考代码 (Chapter 13 Decorator\sample01) 演示……

装饰模式 装饰模式实例与解析 实例二:多重加密系统 某系统提供了一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加密。现使用装饰模式设计该多重加密系统。

装饰模式 装饰模式实例与解析 实例二:多重加密系统

装饰模式 装饰模式实例与解析 实例二:多重加密系统 参考代码 (Chapter 13 Decorator\sample02) 演示……

装饰模式 模式优缺点 装饰模式的优点 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。

装饰模式 模式优缺点 装饰模式的缺点 使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,同时还将产生很多具体装饰类。这些装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度。 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

装饰模式 模式适用环境 在以下情况下可以使用装饰模式: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。不能采用继承的情况主要有两类:第一类是系统中存在大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长;第二类是因为类定义不能继承(如final类)。

装饰模式 模式应用 (1) 在javax.swing包中,可以通过装饰模式动态给一些构件增加新的行为或改善其外观显示。 如JList构件本身并不支持直接滚动,即没有滚动条,要创建可以滚动的列表,可以使用如下代码实现: JList list = new JList(); JScrollPane sp = new JScrollPane(list);

装饰模式 模式应用 (2) 装饰模式在JDK中最经典的实例是Java IO。 以InputStream为例:

装饰模式 模式应用 (2) 抽象装饰类:FilterInputStream …… protected volatile InputStream in; protected FilterInputStream(InputStream in) { this.in = in; }

装饰模式 模式应用 (2) 角色分配: 抽象构件类:InputStream 具体构件类:FileInputStream、ByteArrayInputStream等 抽象装饰类:FilterInputStream 具体装饰类:BufferedInputStream、DataInputStream等

装饰模式 模式应用 (2) 客户端使用: …… FileInputStream inFS=new FileInputStream("temp/fileSrc.txt"); BufferedInputStream inBS=new BufferedInputStream(inFS); //定义一个字节数组,用于存放缓冲数据 byte[] data = new byte[1024]; inBS.read(data);

装饰模式 模式扩展 装饰模式的简化-需要注意的问题 一个装饰类的接口必须与被装饰类的接口保持相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以一致对待。 尽量保持具体构件类Component作为一个“轻”类,也就是说不要把太多的逻辑和状态放在具体构件类中,可以通过装饰类对其进行扩展。 如果只有一个具体构件类而没有抽象构件类,那么抽象装饰类可以作为具体构件类的直接子类。

装饰模式 模式扩展 装饰模式的简化

装饰模式 模式扩展 透明装饰模式(多重加密系统) 在透明装饰模式中,要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型。 Cipher sc,cc,ac; sc=new SimpleCipher(); cc=new ComplexCipher(sc); ac=new AdvancedCipher(cc);

装饰模式 模式扩展 半透明装饰模式(变形金刚) 大多数装饰模式都是半透明(semi-transparent)的装饰模式,而不是完全透明(transparent)的。即允许用户在客户端声明具体装饰者类型的对象,调用在具体装饰者中新增的方法。 Transform camaro; camaro=new Car(); camaro.move(); Robot bumblebee=new Robot(camaro); bumblebee.move(); bumblebee.say();

本章小结 装饰模式用于动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。它是一种对象结构型模式。 装饰模式包含四个角色:抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法);具体构件定义了具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法);抽象装饰类是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现;具体装饰类是抽象装饰类的子类,负责向构件添加新的职责。 使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。

本章小结 装饰模式的主要优点在于可以提供比继承更多的灵活性,可以通过一种动态的方式来扩展一个对象的功能,并通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,而且具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类;其主要缺点在于使用装饰模式进行系统设计时将产生很多小对象,而且装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。 装饰模式适用情况包括:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;需要动态地给一个对象增加功能,这些功能也可以动态地被撤销;当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。 装饰模式可分为透明装饰模式和半透明装饰模式:在透明装饰模式中,要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型;半透明装饰模式允许用户在客户端声明具体装饰者类型的对象,调用在具体装饰者中新增的方法。

END Thanks!