结构性模式--处理类与对象的组合
作者总结了七个结构型模式,这些模式的例子可以在工具、住宅配线、数学、节日传统、零售目录和银行业中找到。
适配器(Adapter)举例
适配器模式允许将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。扳手提供了一个适配器的例子。一个孔套在棘齿上,棘齿的每个边的尺寸是相同的。在美国典型的边长为 1/2’’和1/4’’。显然,如果不使用一个适配器的话,1/2’’的棘齿不能适合 1/4’’的孔。一个1/2’’至 1/4’’ 的适配器具有一个1/2’’的阴槽来套上一个1/2’’的齿,同时有一个1/4的阳槽来卡入1/4’’的扳手。

图 6:使用扳手适配器例子的适配器对象图
桥接(Bridge)举例
桥接模式将抽象部分与它的实现分离,使它们能够独立地变化。一个普通的开关控制的电灯、电风扇等等,
都是桥接的例子。开关的目的是将设备打开或关闭。实际的开关可以是简单的双刀拉链开关,也可以是调光开关。

图 7:使用电子开关例子的桥接对象图
组合(
Composite
)例子
组合模式将对象组合成树形结构以表示“部分
-
整体”的层次结构。让用户一致地使用单个对象和组合对象。
虽
然例子抽象一些,但是算术表达式确实是组合的例子。算术表达式包括操作数、操作符和另一个操作数。操作
数可以是数字,也可以是另一个表达式
。这样,
2+3
和(
2+3
)
+
(
4*6
)都是合法的表达式。

图
8
:使用算术表达式例子的组合模式对象图
装饰(Decorator
)举例
装
饰模式动态地给一个对象添加额外的职责。不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框
的
,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形
成了一个物体。

图
9
:使
用有画框的画作为例子的装饰模式对象图
外观(
Facade
)举例
外
观模式为子系统中的接口定义了一个统一的更高层次的界面,以便于使用。当消费者按照目录采购时,则
体现了一个外观模式。消费者拨打一个号码与客服代表联系,客服代表则扮演了这个“外观”,他包含了与订货部、
收银部和送货部的接口。

图 10:使用电话订货例子的外观模式对象图
享元(
Flyweight
)举例
享元模式使用共享技术有效地支持大量细粒度的对象。公共交换电话网(
PSTN
)
是享元的一个例子。有一些
资
源例如拨号音发生器、振铃发生器和拨号接收器是必须由所有用户共享的。当一个用户拿起听筒打电话时,他
不需要知道使用了多少资源
。对于用户而言所有的事情就是有拨号音,拨打号码,拨通电话。

图
1
1
:使用拨号音发生器例子的享元模式对象图
代理(
Proxy
)模式
代理模式提供一个中介以控制对这个对象的访问。一张支票或银行存单是账户中资金的代理。支票在市场交
易中用来代替现金,并提供对签发人账号上资金的控制。

图
12
:使用银行存单例子的代理模式对象图