第3章 结构型模式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– – – – ByteArrayInputStream FileInputStream PipedInputStream StringBufferInputStream
• 链接流处理器:
– FilterInputStream – BufferInputStream – DataInputStream …
7
实例形式
8
实例形式涉及的成员
• 目标(Target)。这就是我们所期待得 到的接口。目标可以是实的或抽象的类。 • 源(Adaptee)。现有需要适配的接口。 • 变压器(Adapter)。变压器类是本模式 的核心。变压器把源接口转换成目标接 口。 显然,这一角色必须是实类。
9
应用场合
• 第一、 你需要使用现有的类,而此类的接口不 符合你的需要。 • 第二、 你想要建立一个可以重复使用的类,用 以与一些彼此之间没有太大关联的一些类, 包 括一些可能在将来引进的类一起工作。这些源 类不一定有很复杂的接口。 • 第三、 (对实例形式的变压器模式而言)你需 要改变多个已有的子类的接口, 如果使用类形 式的变压器模式,就要针对每一个子类做一个 变压器类,而这不太实际。
65
Java I/O中的装饰模式
66
Java I/O中的装饰模式
67
和其他模式的关系
• 代理模式:
– 装饰模式应当为所装饰的对象提供增强功能,而代 理模式对对象的使用施加控制,并不提供对象本身 的增强功能。
• 适配器模式:
– 适配器模式是要改变所考虑对象的接口而不一定改 变对象的性能。 – 而装饰模式是要保持接口而增强所考虑对象的性能。
42
JDBC驱动器
43
飞机例子
• 空中巴士(Airbus)、波音(Boeing)、 麦道(MD)都是飞机制造商,他们都生 产载客飞机(PassengerPlane)、和载货 (CargoPlane),设计一个系统,描述这 些飞机制造商以及它们所制造的飞机种 类。
44
方案一
45
方案二
46
应用场合
1、适配器模式
• 变压器模式把一个类的接口变换成客户 端所期待的另一种接口。 • 变压器模式使原本无法在一起工作的两 个类能够在一起工作。
3
电压适配
• 当我把美国的电器拿回中国大陆去用的 时候, 我就面临电压不同的问题。美国 的生活用电压是110伏,而中国的电压是 220伏。 • 我如果要在中国大陆使用我在美国使用 的电器, 我就必须有一个能把220伏电 压转换成110伏电压的变压器。
桥梁模式的用意是把所考虑 的类的抽象化和实现化分开 ,在这里没有这样的环境。 所以JDBC/ODBC不是桥梁模 式,而是适配器模式。
48
5、合成(Composite)模式
• 将对象以树形结构组织起来,以达成“部分 -整体” 的层次结构。 • 使得客户端对单个对象和组合对象的使 用具有一致性。 Baidu Nhomakorabea 合成模式可分为安全式和透明式两种。
17
代理模式的时序
18
代理模式的分类
• 远程代理:为一个位于不同的地址空间的对象 提供一个局部代表对象。 • 虚拟代理:根据需要创建一个资源消耗较大的 对象,使得此对象只在需要时才会被真正创建。 • 智能引用代理:当一个对象被引用时提供一些 额外的操作,比如将对此对象调用的次数记录 下来 • 保护代理:控制对一个对象的访问权限。
51
透明的合成模式
52
道士的故事
• 从前有座山,山上有座庙,庙里有个道 士讲故事,讲的故事是:从前有座山, 山上有座庙,庙里有个道士讲故事,讲 的故事是:从前有座山,山上有座庙, 庙里有个道士讲故事,讲的故事。。。
53
道士的故事
54
AWT中的例子
55
JUnit中的例子
56
通过合成模式实现货架统计
13
指猫为狗答案
14
2、代理(Proxy)模式
• 所谓代理,就是一个人或者一个机构代 表另一个人或者另一个机构采取行动。 • 在一些情况下,一个客户不想或者不能 够直接引用一个对象,而代理对象可以 在客户端和目标对象之间起到中介的作 用。
15
代理模式的结构
16
代理模式的角色
• 抽象主题角色:声明了真实主题和代理主题的 共同接口,这样在任何可用真实主题的地方都 可以使用代理主题。 • 代理主题角色:代理主题角色内部含有对真实 主题的引用,从而可以在任何时候操作真实主 题对象,代理角色通常在将客户端调用传递给 真实的主题之前或之后,都要执行某个操作。 • 真实主题角色:定义了代理角色所代表的真实 对象。
22
结构图
1、抽象和具体的划分
2、辅助功能的提供
23
结构图
3、引入代理角色
24
系统的时序
25
和其他模式的关系
• 装饰模式:
– 装饰模式与所装饰的对象具有相同的接口, 因此两种模式可能混淆。 – 但是,装饰模式应当为所装饰的对象提供增 强功能,而代理模式对对象的使用施加控制, 并不提供对象本身的增强功能。
30
医院子系统—采用门面之前
31
医院子系统—采用门面之后
32
应用场景
• 为一个复杂子系统提供一个简单接口 • 子系统的独立性
– 引用Facade模式将一个子系统和它的客户端 以及其他的子系统分离,可以提供子系统的 独立性和可移植性。
• 层次化结构
– 如果层与层之间相互依赖,可限定他们只通 过Façade进行通信,从而简化了层与层之间 的依赖关系。
58
6、装饰(Decorator)模式
• 装饰模式以对客户端透明的方式扩展对 象的功能,是继承关系的一个替代方案。 • 装饰模式可以在不使用创造更多子类的 情况下,将对象的功能加以扩展。 • 装饰模式使用原来被装饰的类的一个子 类的实例,把客户端的调用委派到被装 饰类。
59
装饰模式的结构
60
装饰模式中的角色
• 网上商城中商品都存放在货架上,但货 架上除了存放商品还可能有下一级子货 架。 • 如何统计某个节点下所有商品的总的金 额?
57
练习
• 模拟一个文件目录系统,目录结构如下: • 实现如下功能
– 统计Root目录下文件的总数 – 将Root目录下的所有文件都置成只读的。
Root |---DirA | |---FileA | |---FileB |---DirB | |---FileX | |---FileY | |---FileZ
28
门面模式类图
29
门面模式中的角色:
• 门面(Facade)角色:客户端可以调用 这个角色的方法。此角色知晓相关的子 系统的功能和责任。正常情况下,本角 色将所有从客户端发来的请求委派到相 应的子系统去。 • 子系统(SubSystem)角色:可以同时有 一个或者多个子系统。对于子系统而言, 门面也是一个客户端。
33
保安系统—采用门面之前
34
保安系统—采用门面之后
35
Session门面模式
36
Session门面模式
37
编译器门面模式
38
讨论
• 对于数据库访问的操作,是否可以采用 Façade模式,封装一个大的接口,暴露 给客户端更简单的调用方法? • 如果可以的话,这个接口应该包含那些 方法呢?
10
Java适配器的使用
• 库程序包java\awt\event
– – – – – – – – WindowAdapter ContainerAdapter FocusAdapter HierarchyBoundsAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter
39
4、桥梁模式
• 将抽象化和实现化脱耦,使得二者可以 独立地变化。
– 抽象化:存在于多个实体中的共同的概念性 联系,就是抽象化 – 实现化:抽象化给出的具体实现,就是实现 化 – 脱耦:耦合指的是两个实体的行为的某种强 关联,将他们的强关联去掉就是脱耦
40
桥梁模式的结构
41
桥梁模式的角色
• 抽象化(Abstraction)角色:抽象化给出的定 义,并保存对一个实现化对象的引用。 • 修正抽象化(RefinedAbstraction)角色:扩展 抽象化角色,改变和修正父类对抽象化的定义。 • 实现化(Implementor)角色:给出实现化角色 的接口,但不给出具体的实现。 • 具体实现化(ConcreteImplementor)角色:给出 实现化角色接口的具体实现。
4
变压器模式分类
• 类形式 • 实例形式
5
类形式
6
类形式涉及的成员
• 目标(Target)。这就是我们所期待得 到的接口。注意,由于这里讨论的是类 变压器模式,因此目标不可以是类。 • 源(Adaptee)。现有需要适配的接口。 • 变压器(Adapter)。变压器类是本模式 的核心。变压器把源接口转换成目标接 口。显然,这一角色不可以是接口, 而 必须是实类。
• 门面模式:
– 有的时候,门面模式兼任代理的责任。
26
练习
• 有一位同学请另一位同学代替他参加一 个英文水平考试,请问这是什么模式? 请给出模拟系统的类图
27
3、门面(Facade)模式
• 门面模式要求一个子系统的外部和内部 的通信必须通过一个统一的门面 (Facade)对象进行 • 门面模式提供了一个高层次的接口,使 得子系统更容易使用。
UML语言与设计模式
第3章 结构型模式
主讲:张国平 Email:zhanggp@mail.hdpu.edu.cn
结构型模式涉及到如何组合类和对象 以获得更大的结构。 结构型类模式:采用继承机制来组合 接口或实现。 结构型对象模式:不是对接口和实现进 行组合,而是描述如何对一些对象进行 组合,从而实现新功能的一些方法。
61
齐天大圣七十二变
62
应用场景
• 需要扩展一个类的功能,或给一个类增 加附加责任。 • 需要动态地给一个对象增加功能,这些 功能可以再动态地撤销。 • 需要增加由一些基本功能的排列组合而 产生的非常大量的功能,从而使继承关 系变得不现实。
63
模式的简化
64
Java I/O中的装饰模式
• 原始流处理器:
49
安全式的合成模式
50
涉及的角色
• 抽象构件(Component)角色:他给参加组合 的对象规定一个接口。这个角色给出共有的接 口及其默认行为。 • 树叶构件(Leaf)角色:代表参加组合的树叶 对象。一个树叶没有下级子对象。定义出参加 组合的原始对象的行为。 • 树枝构件(Composite)角色:代表参加组合的 有子对象的对象,并给出树枝构件对象的行为。
19
高老庄悟空降八戒
• 为将高家三小姐解救出八戒的魔掌,悟 空决定扮做高小姐,会会这妖怪….
20
高老庄悟空降八戒
21
智能引用代理的例子
• 一个动态网站提供美国上市企业的股票 买卖信息。 • 本网站,用户做的事情基本就是搜索和 查询。 • 本网站收费:
– 验证身份(是智能代理吗?) – 统计使用次数
11
• 库程序包Javax\swing\event
– InternalFrameAdapter – MouseInputAdapter
WindowAdapter
• 缺省适配器
12
指猫为狗
• 请做一个小猫(kittie)的实类,并实现 miao(),catchRat(),run(),sleep()等方法。 再做一个小狗(doggie)的接口,要求有 wao(),fetchBall(),run(),sleep()等方法。 • 现在你的女朋友想要一只小狗,可是你 只找到的一只小猫。请用适配器模式把 小猫“适配成”小狗, 让你的女朋友满意。
• 需要在构件的抽象化角色和具体化角色之间增 加更多的灵活性。 • 要求实现化的角色的任何改变不应该影响客户 端。 • 一个构件有多于一个的抽象化角色和实现化角 色,系统需要他们动态耦合。 • 虽然可以使用继承,但由于抽象化角色和具体 化角色要求独立变化,设计要求需要独立管理 这二者。
47
讨论
• 请问JDBC/ODBC桥是桥梁模式的应用吗?
• 抽象构件(Component)角色:给出一个抽象 接口,以规范准备接受附加责任的对象。 • 具体构件(ConcreteComponent)角色:定义一 个将要接收附加责任的类。 • 装饰(Decorator)角色:持有一个构件 (Component)对象的实例,并定义一个与抽 象构件接口一致的接口。 • 具体装饰(ConcreteDecorator)角色:负责给 构件对象“贴上”附件的责任。
• 策略模式:
– 装饰模式将一个东西的表皮换掉,而保持它的内心, 策略模式恰好相反。
相关文档
最新文档