结构型模式
代理(Proxy)模式
简介:为某对象提供一红代理以控制该对象的访问。即客户端通过代理简介地访问该对象
,从而限制、增强或修改该对象的一些特性。
定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问
。这时,访问对象不适合或者不能直接引用对象
,代理对象作为访问对象和目标对象之间的中介。
优点:
- 代理模式在
客户端与目标对象
之间起到一个中介作用和保护目标对象的作用
。 - 代理对象可以扩展目标对象的功能。
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度。
缺点:
- 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
- 增加了系统复杂度。
应用场景:
- 远程访问,这种方式通常是
为了隐藏目标对象存在于不同地址空间的事实
,方便客户端访问。 - 虚拟代理,这种方式通常
用于创建的目标开销很大时
,先用小比例的虚拟代理替换真实对象,消除用户对服务器慢的感觉 - 安全代理,这种方式通常
用于控制不同类型 客户对真实对象的访问权限
。 - 智能指引,这种方式主要
用于当调用目标对象时,代理附加一些额外的处理功能
。 - 延迟加载,这种方式是为了
提高系统的性能,延迟对目标的加载
。
上述为静态代理模式,其存在两个缺点:
- 真实主题与代理主题一一对应,增加真实主题也要增加代理主题。
- 设计代理以前真实代理必须事先存在,不够灵活。
主要角色:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(RealSubject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是我们最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问或控制或扩展真实主题的功能
采用动态代理可以解决以上问题,其结构图如下:
举例:韶关“天街e角”公司是一家婺源特产公司的代理公司,用代理模式实现
- “婺源特产公司”是真实主题
- “天街e角”是代理,它可以调用婺源公司的相关方法,并且可以增加一些额外的处理
- 客户端通过“天街e角”公司间接访问“婺源公司”的产品
适配器(Adapter)模式
定义:将一个类的接口转换成客户希望的另一个接口
,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
优点:
- 客户端通过适配器可以透明地调用目标接口;
- 程序员不需要修改原有代码而重用现有的适配者类
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
缺点:对于类适配器来说,更换适配器的实现过程比较复杂
适用场景:
- 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致
- 适用第三方提供的组件,但组件定义的和自己要求的接口定义不同
适配器模式包含以下主要角色:
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转化器,通过继承或引用适配者的对象,把是适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
注意:一个适配器对应一个适配者
,适配器模式分为类适配器模式和对象适配器模式2种
类适配器模式结构图如下:
对象适配器模式结构图如下:
两者的区别: 类适配器直接通过适配者类调用 对象适配器通过实现引用适配者类来调用适配者类中的方法 两者在使用上没有太过于严格的区分
举例说明:用对象适配器模式模拟新能源汽车的发动机
- 新能源汽车的发动机有电能发动机和光能发动机
- 客户端希望用统一的发动机驱动方法drive()访问者两种发动机
桥接(Bridge)模式
定义:将抽象和现实分离,使他们可以独立变化。它是用组合关系代替继承关系
来实现的,从而降低了抽象和实现这两个可变维度的耦合度。
优点:
- 由于抽象和现实分离,所以扩展能力强
- 其实现细节对客户透明。
缺点:由于聚合的关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度
适用场景:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性时。
桥接模式主要角色:
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对现实化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implenmentor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体现实化(Concrete Implementor)角色:给出现实化角色接口的具体实现。
桥接模式结构图如下:
举例:用桥接模式模拟女士皮包的选购
- 女士皮包种类多,可以按用途、颜色等划分,存在多维度的变化