案例一
插座的电压是 220V,手机充电器会把 220V 转换成 5V电压给手机充电,此时这个充电器就是一个适配器。
AC220:插座输出 220V 电压
1 2 3 4 5 6
| public class AC220 { public int outputAC220V() { System.out.println("[插座电源] 输出交流电220V"); return 220; } }
|
DC5(接口):手机充电器输出5V电压
1 2 3
| public interface DC5 { int output5V(); }
|
PowerAdapter 电源适配器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class PowerAdapter implements DC5 { private AC220 ac220;
public PowerAdapter(AC220 ac220) { this.ac220 = ac220; }
@Override public int output5V() { int adapterInput = ac220.outputAC220V(); int adapterOutput = adapterInput / 44; System.out.println("[手机充电器]使用电源适配器转换为" + adapterOutput + "V电压"); return adapterOutput; } }
|
Test 测试类
1 2 3 4 5
| public class PowerAdapterTest { public static void main(String[] args) { new PowerAdapter(new AC220()).output5V(); } }
|
案例二
外国人听不懂中文,我们只会讲中文,那么需要一个翻译,把中文翻译成英文
Chinese 中国人
1 2 3 4 5 6
| public class Chinese { public String speak() { System.out.println("[中国人]你好"); return "你好"; } }
|
Translator(接口):翻译中文
1 2 3
| public interface Translator { String translate(); }
|
TranslateAdapter:翻译适配
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class TranslateAdapter implements Translator { private Chinese chinese;
public TranslateAdapter(Chinese chinese) { this.chinese = chinese; }
@Override public String translate() { System.out.println("[翻译适配器]将" + chinese.speak() + "翻译成英文:Hello"); return "Hello"; } }
|
Test 测试类
1 2 3 4 5
| public class AdapterTest { public static void main(String[] args) { new TranslateAdapter(new Chinese()).translate(); } }
|
优缺点
优点
(1)提高类的透明性和复用性,现有的类会被服用但不需要改变;
(2)目标类和适配器类解耦,可以提高程序的扩展性;
(3)大多数场景符合开闭原则;
缺点
(1)在适配器代码编写时,需要全面考虑,可能会增加系统的复杂度;
(2)增加了代码的阅读难度,降低了代码的可读性,过多使用适配器会使系统的代码凌乱;