当前位置:文档之家› 第3章 结构型模式

第3章 结构型模式

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