接前一篇文章:软考 系统架构设计师系列知识点之设计模式(2)
所属章节:
老版(第一版)教材
第7章. 设计模式
第2节. 设计模式实例
2. 结构型模式
结构型模式控制了应用程序较大部分之间的关系。它将以不同的方式影响应用程序,例如Adapter模式允许两个不兼容的系统进行通信,而Facade模式允许在不删除系统中所有可用选项的情况下为用户提供一个简化的界面。结构型模式允许在不重写代码或自定义代码的情况下创建系统。这可以使系统具有增强的重复实用性和应用性能。结构型模式包括:
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
(1)Adapter模式
Adapter模式可以充当两个类之间的媒介,它可以转换一个类的接口,这样就可以被另外一个类使用,这使得具有不兼容接口的类能够协同使用。Adapter模式实现为客户端所知的接口,并且为客户端提供对不为其所知的类实例的访问。Adapter对象可以在不知道实现该接口的类的情况下提供该接口的功能。
Adapter模式的优点如下:
- 允许两个或多个不兼容的对象进行交互和通信。
- 提高已有功能的重复使用性。
在以下情况中,应该使用Adapter模式:
- 要使用已有类,而该类接口与所需的接口并不匹配。
- 要创建可重用的类,该类可以与不相关或未知类进行协作。也就是说,类之间斌不需要兼容接口。
- 要在一个不同于已知对象接口的接口环境中使用对象。
- 必须要进行多个源之间的接口转换的时候。
(2)Bridge模式
Bridge模式可以将一个复杂的组件分成两个独立的但又相关的继承层次结构:功能性的抽象和内部实现。改变组件的这两个层次结构很简单,以至于它们可以相互独立地变化。当具有抽象的层次结构和相应的实现层次结构时,Bridge模式是非常有用的。除了可以抽象和实现组合成许多不同的类,该模式还可以以动态组合的独立类的形式实现这些抽象和实现。
Bridge模式的优点如下:
- 可以将接口与实现相分离。
- 提高了可扩展性。
- 对客户端隐藏了实现的细节。
在以下情况中,应该使用Bridge模式:
- 想避免在抽象及其实现之间存在永久的绑定;
- 抽象及其实现可以使用子类进行扩展。
- 抽象的实现被改动应该对客户端没有影响;也就是说,不用重新编译代码。
(3)Composite模式
Composite模式允许创建树型层次结构来改变复杂性,同时允许结构中的每一个元素操作同一个接口。该模式将对象组合成树型结构来表示整个或部分的层次结构。这就意味着Composite模式允许客户端使用单个对象或多个同一对象的组合。
Composite模式的优点如下:
- 定义了由主要对象和复合对象组成的类层次结构。
- 使得添加新的组件类型更加简单。
- 提供了结构的灵活性和可管理的接口。
在以下情况中,应该使用Composite模式:
- 想要表示对象的整个或部分的层次结构。
- 想要客户端能够忽略复合对象和单个对象之间的差异。
- 结构可以具有任何级别的复杂性,而且是动态的。
(4)Decorator模式
Decorator模式可以在不修改对象外观和功能的情况下添加或者删除对象功能。它可以使用一种对客户端来说是透明的方法来修改对象的功能,也就是使用初始类的子类实例对初始对象进行授权。Decorator模式还为对象动态地添加了额外的责任,这样就在不使用静态集成的情况下,为修改对象功能提供了灵活的选择。
Decorator模式的优点如下:
- 比静态继承具有更大的灵活性。
- 避免了特征装载的类处于层次结构的过高级别。
- 简化了代码,因为用户编写的每一个类都针对功能的一个特定部分,而不用将所有的行为编码到对象中。
- 改进了对象的扩展性,因为用户可以通过编写新的类来作出改变。
在以下情况中,应该使用Decorator模式:
- 想要在单个对象中动态并且透明地添加责任,而这样并不会影响其它对象。
- 想要在以后可能要修改的对象中添加责任。
- 当无法通过静态子类化实现扩展时。
(5)Facade模式
Facade模式为子系统的一组接口提供了一个统一的接口。因为只有一个接口,该模式就定义了更容易使用子系统的高级接口。这个统一的接口允许对象使用该接口与子系统进行通信,从而实现对子系统的访问。
Facade模式的优点如下:
- 在不减少系统所提供的选项的情况下,为复杂系统提供了简单接口。
- 对客户端屏蔽了子系统组件。
- 提高了子系统与其客户端之间的弱耦合度。
- 如果每一个子系统使用自身的Facade模式而且系统的其它部分也使用Facade模式与子系统进行通信的话,就可以降低子系统之间的耦合度。
- 将客户端请求转换后发送给能够处理这些请求的子系统。
在以下情况中,应该使用Facade模式:
- 想要为复杂的子系统提供简单的接口。
- 在客户端和抽象的实现类中存在许多依赖关系。
- 想要对子系统进行分层。
(6)Flyweight模式
Flyweight模式可以通过共享对象减少系统中低等级的、详细的对象数目。如果一个类实例包含用来