摘要:
结构型模式,是从程序的结构上解决模块之间的耦合问题,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式)。这些结构型模式,借由一以贯之的方式来了解元件间的关系,以简化设计,仔细推敲,侧重点却各有不同。
下面我们就具体来了解一下:
一、适配器模式
背景 |
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中,但是新的环境要求的接口是这些现存对象不满足的。如何应对这种变化?如何利用现有对象的良好实现,同时又能满足环境所需的接口要求。 |
目标 |
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 |
结构图 |
|
例子 |
笔记本上配备的电源适配器,将220V的电压转换成笔记本使用的电压。 |
二、桥接模式
背景 |
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 |
目标 |
将抽象部分与它的实现部分分离,使他们可以独立的变化。 |
结构图 |
|
例子 |
大学的课程:大学可分为有名牌大学、985大学、211大学、普通大学等不同级别,但是每一所大学都可以设置课程,课程可包括英语、数学、政治等。 |
三、组合模式
背景 |
在软件系统中,当发现需求中体现部分和整体层次结构时,以及希望用户可以忽略组合对象和单个对象的不同,统一地使用组合结构中的所有对象 |
目标 |
将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 |
结构图 |
|
例子 |
算术运算:1+2和(1+1)+(2*3)都是合法的表达式。这就是说单个数字和表达式这个整体都可以进行加法运算符的操作。 |
四、代理模式
背 景 |
通过控制来延迟对象的创建和实例化,直到真正需要使用该对象才进行创建和实例化。由于一些对象创建和实例化需要占用大量系统资源,但我们并不能确定用户一定会调用该对象,所以通过延迟对象实例化来减缓系统资源的消耗。 |
目 标 |
为其他对象提供一种代理以控制对这个对象的访问。 |
结构图 |
|
例子 |
律师就是我们保护自己合法权益一个代理模式 |
五、享元模式
背景 |
面向对象的思想很好的解决了抽象性的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户的操作呢? |
目标 |
运用共享技术有效地支持大量细粒度的对象。 |
结构图 |
|
例子 |
公共交换电话网(PSTN)是享元的一个例子。 |
六、外观模式
背景 |
在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦? |
目标 |
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易维护。 |
结构图 |
|
例子 |
拨打10086,可以进行话费查询、业务办理、人工服务等,而10086则是对子对象所使用的一致界面。 |
七、装饰模式
背景 |
在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性,并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态的实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低? |
目标 |
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活 |
结构图 |
|
例子 |
一幅画,可以直接挂到墙上,也可以加上相框和玻璃后,再挂到墙上 |