适配器模式
适配器模式将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器的核心在于将一个适配者 Adaptee,通过适配器 Adapter 转换为另一个接口 Target 来使用。实现原理就是 Adapter 通过实现 Target 接口,并在对应的方法中调用 Adaptee 的接口实现。
适配器模式的角色和职责如下:
- 目标抽象类 Target:定义客户所需要的接口,也可以是具体类。
- 适配器类 Adapter:适配器类是适配器模式的核心,在对象适配器中,它通过继承(活实现)Target 并关联一个 Adaptee 对象使二者产生联系。
- 适配者类 Adaptee:被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。
案例
1 | // Target 是适配的目标接口 |
优缺点
优点:
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
- 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
- 灵活性和扩展性都非常好,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合开闭原则。
缺点:
- 比较麻烦。
外观模式
根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
外观模式将众多子功能组合起来,提供一个简单一致的界面(Facade)。外观模式的角色和职责如下:
- 外观角色 Facade:对外提供的接口,定义简单的调用接口。
- 子系统角色 SubSystem:功能的提供者,为外观角色提供子功能。
案例
外观模式的案例:将电视、游戏机、灯等子功能进行组合,形成家庭影院这个外观角色。家庭影院只对外提供看电影、KTV、打游戏这三项功能,这些功能都是子功能的组合。