适配器模式说明
适配器模式(Adapter) 通常也被称为转换器,当一个对象或类的接口不能匹配用户所期待的接口时,适配器就充当中间转换的角色,以达到兼容用户接口的目的,同时适配器也实现了客户端与接口的解耦,提高了组件的可复用性
充当一个适配、兼容的工作
例子
两插脚的电子设备如何使用三孔插座实现通电,开启电视
● Target(目标接口):客户端要使用的目标接口标准,对应本章例程中的三相插孔接口TriplePin。
● Adapter(适配器):实现了目标接口,负责适配(转换)被适配者的接口specificRequest()为目标接口request(),对应本章例程中的电视机专属适配器类TVAdapter。
● Adaptee(被适配者):被适配者的接口标准,目前不能兼容目标接口的问题接口,可以有多种实现类,对应本章例程中的两相插孔接口DualPin。
● Client(客户端):目标接口的使用者。
对象适配器/类适配器
二者的区别在于前者的Adaptee(被适配者)以接口形式出现并被Adapter(适配器)引用,而后者则以父类的角色出现并被Adapter(适配器)继承,所以前者更加灵活,后者则更为简便,适配器需要具备适配双方的基本功能,才能做到兼容,相互对接
类适配器不利于扩展,具体场景下还是具体实用性
实例代码
package com.azure.design.adapter;
/**
* 两孔接口
*/
public interface DualPin {
// 火、零
public void electrify (int l, int n);
}
package com.azure.design.adapter;
/**
* 三孔接口
*/
public interface TriplePin {
// 火、地、零
public void electrify (int l, int n, int e);
}
package com.azure.design.adapter;
import com.azure.design.proxy.dymaicproxy.UserService;
public class TV implements DualPin {
@Override
public void electrify(int l, int n) {
System.out.print("接通火线:" + l + ",零线:" + n + "!" );
System.out.println("电视开了" );
}
}
package com.azure.design.adapter;
/**
*
*/
public class Adapter implements TriplePin{
private DualPin dualPin;
// 创建适配器时, 将两插设备注入
public Adapter(DualPin dualPin) {
this.dualPin = dualPin;
}
@Override
public void electrify(int l, int n, int e) {
// 调用三插接口的方法实际上调的时两插接口的方法
dualPin.electrify(l, n);
}
}
package com.azure.design.adapter;
/**
* 电视专属适配器
*/
public class TVAdapter extends TV implements TriplePin{
@Override
public void electrify(int l, int n, int e) {
super.electrify(l, n);
}
}
package com.azure.design.adapter;
import org.junit.Test;
public class Client {
/**
* 对象适配器
*/
@Test
public void tesAdapterDemo() {
Adapter adapter = new Adapter(new TV());
adapter.electrify(1,0,-1);
}
/**
* 专属适配器
*/
@Test
public void tesTVAdapterDemo() {
TVAdapter adapter = new TVAdapter();
adapter.electrify(1,0,-1);
}
}