结构型模式的思路是组合,而根据组合侧重的不同方面,分为了不同的模式。
-
结构型模式的思路和行为型模式中的模板方法模式有一定相似性,尤其是在实现具体的函数时,不过不同之处在于模板方法模式采用的是继承,并且它们的目的也不一样,结构型模式的目的是扩展、增减功能,而模板方法模式的目的是泛化通用流程。
-
代理模式组合了一个提供具体功能的对象,然后为其它对象提供相同的接口;可以通过代理模式进行缓存、记录log、访问限制等操作,但主要的功能还是由其内部持有的提供服务的对象提供的。
-
由于代理对象和服务对象遵循相同的接口,因此它们可以互换。
-
相比之下装饰器对象尽管和源服务对象拥有相同的接口,但它们无法互换使用,原因在于装饰器对象依赖源对象来提供服务,装饰器对象本身能够增强服务功能,但并没有真正实现服务功能,它是依赖于服务对象来实现功能的;这导致装饰器模式受声明顺序的影响。
-
装饰器模式像是个单链表。
-
可以声明多个装饰器类并动态配置装饰器对象。
-
适配器模式与代理模式和装饰器模式相比仍然依赖已有服务对象来提供功能,但不同的是,适配器对象使用已有服务来提供新的功能而不是实现与现有服务对象相同的接口。适配器模式一般用于实现需要用到遗留系统的功能的新的需求。
-
门面模式也提供新的功能,与适配器不同的是:适配器通常只封装一个服务对象, 而门面对象作用的范围更广,通常会作用于整个对象子系统上。
代理模式
装饰模式
class Application is
method dumbUsageExample() is
source = new FileDataSource("somefile.dat")
source.writeData(salaryRecords)
// 已将明码数据写入目标文件。
source = new CompressionDecorator(source)
source.writeData(salaryRecords)
// 已将压缩数据写入目标文件。
source = new EncryptionDecorator(source)
// 源变量中现在包含:
// Encryption > Compression > FileDataSource
source.writeData(salaryRecords)
// 已将压缩且加密的数据写入目标文件。
适配器模式
比如,已有服务能够处理某种格式的数据,而新的业务要求使用另外一种格式,此时就可以创建适配器类来对数据格式进行转换,使得仍然能够复用已有服务来处理新需求。