一、模式定义
- 适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
- 相关组件
- Client:客户端,只与目标接口交互。
- Target:适配器实现的目标接口。
- Adapter:适配器,使用组合方式包装被适配者。
- Adaptee:被适配者,所有的请求都委托给这个类。
二、举例说明
- 场景:通过创建适配器进行接口转换,让不兼容的接口变成兼容。
- 具体需求:目前峡谷中的英雄有一个统一的接口类Hero,英雄释放技能都是使用Hero接口中定义的方法。近期又要纳入一位新英雄——齐天大圣。不过,这个英雄的代码是从其他公司收购过来的,未实现我们的Hero接口,而且释放技能的方法与Hero定义的方法完全不同。怎么能改动最小兼容此英雄呢。
三、代码实现
- 目前的Hero接口类(目标接口)
public interface Hero { /** * 释放Q技能 */ void skillQ(); /** * 释放W技能 */ void skillW(); }
- 被收购公司的齐天大圣类(被适配者)
public class MonkeyKing { /** * 被收购公司的1技能,对应目标接口的Q节能 */ void skill1() { System.out.println("猴王技能:粉碎打击!"); } /** * 被收购公司的2技能,对应目标接口的W节能 */ void skill2() { System.out.println("猴王技能:真假猴王!"); } }
- 适配器(可以使用组合或继承被适配者,以下是组合方式)
public class MonkeyAdapter implements Hero { private MonkeyKing monkeyKing; public MonkeyAdapter(MonkeyKing monkeyKing) { this.monkeyKing = monkeyKing; } @Override public void skillQ() { System.out.println("使用适配器,调用猴子(被适配者)的1技能"); monkeyKing.skill1(); } @Override public void skillW() { System.out.println("使用适配器,调用猴子(被适配者)的2技能"); monkeyKing.skill2(); } }
- 客户端调用
public static void main(String[] args) { // 1.创建被适配者 MonkeyKing monkeyKing = new MonkeyKing(); // 2.创建适配器 Hero hero = new MonkeyAdapter(monkeyKing); hero.skillQ(); hero.skillW(); }
执行结果