手机充电问题
想给手机充电,家用电的220V交流电则需要转换成适配司机的5V,则充电器充当了适配器。
适配器模式
适配器模式 会将某个类的接口转换成客户期望的另一个接口表示,主要目的是兼容性。
让原本因接口不匹配不能工作的两个类可以协同工作。别名为包装器
适配器模式结构
类适配器
这一实现使用了继承机制: 适配器同时继承两个对象的接口。 注:Java中可以继承一个类,实现另外一个接口。
类适配器
不需要封装任何对象, 因为它同时继承了客户端和服务的行为。 适配功能在重写的方法中完成。 最后生成的适配器可替代已有的客户端类进行使用
对象适配器
实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 所有流行的编程语言都可以实现适配器。
1.客户端 (Client)
是包含当前程序业务逻辑的类。
2.客户端接口 (Client Interface
) 描述了其他类与客户端代码合作时必须遵循的协议。
3.服务 (Service)
中有一些功能类 (通常来自第三方或遗留系统)。 客户端与其接口不兼容, 因此无法直接调用其功能。
4.适配器 (Adapter)
是一个可以同时与客户端和服务交互的类: 它在实现客户端接口的同时封装了服务对象。 适配器接受客户端通过适配器接口发起的调用, 并将其转换为适用于被封装服务对象的调用。
5.客户端代码只需通过接口与适配器交互即可, 无需与具体的适配器类耦合。 因此, 你可以向程序中添加新类型的适配器而无需修改已有代码。 这在服务类的接口被更改或替换时很有用: 你无需修改客户端代码就可以创建新的适配器类。
接口适配器模式
思路:当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为每个方法提供一个默认实现(空方法),那么抽象类的子类可以有选择性地重写父类的某些方法来实现需求
适用于一个接口并不用使用所有的方法
注意细节:
三种方式,是根据 被适配类 是以什么形式 给适配器的。
类适配器:适配器继承 被适配类
对象适配器:适配器 持有 被适配类
接口适配器: 适配器 实现 被适配接口
最大的作用:将原本不兼容的接口融合在一起工作。
适配器模式适合应用场景
1.当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
2. 如果您需要复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
实现方式
1.确保至少有两个类的接口不兼容:
1.1一个无法修改 (通常是第三方、 遗留系统或者存在众多已有依赖的类) 的功能性服务类。
1.2一个或多个将受益于使用服务类的客户端类。
2.声明客户端接口, 描述客户端如何与服务交互。
3.创建遵循客户端接口的适配器类。 所有方法暂时都为空。
4.在适配器类中添加一个成员变量用于保存对于服务对象的引用。 通常情况下会通过构造函数对该成员变量进行初始化, 但有时在调用其方法时将该变量传递给适配器会更方便。
5.依次实现适配器类客户端接口的所有方法。 适配器会将实际工作委派给服务对象, 自身只负责接口或数据格式的转换。
6.客户端必须通过客户端接口使用适配器。 这样一来, 你就可以在不影响客户端代码的情况下修改或扩展适配器。
适配器模式优缺点
优点:
✔️ 单一职责原则_你可以将接口或数据转换代码从程序主要业务逻辑中分离。
✔️ 开闭原则。 只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。
缺点:
❌代码整体复杂度增加, 因为你需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。