java三种适配器模式详解与代码实现
1. 适配器模式定义:
适配器模式是一种结构型设计模式,通过一个适配器类把具有不同方法功能的两个类A和B组合起来,使得这个适配器类同时具有两个类的不同的功能,调用方不管要使用A类的功能还是B类的功能,都可以通过调用适配器类来实现,不用再分别调用A和B;
举个栗子
用户新买了一件两孔插座的电器,但是家里只有一个三孔插座,这个时候怎么办呢?可以再买一个插座适配器,来做转化,把适配器插到三孔插座上,用户直接把电器插到适配器即可
主要角色:源对象,目标对象,适配器
2. 适配器分类
2.1 类适配器模式
通过继承特性来实现适配器功能,继承实现关系如下
源对象
/**
* 两孔插座
*/
public class TwoHoleSocket {
public void twoHole() {
System.out.println("插入两孔插座");
}
}
目标对象
/**
* 三孔插座
*/
public interface ThreeHoleSocket {
void threeHole();
}
适配器
/**
* 适配器:可以同时使用两孔和三孔插座
*/
public class Adapter extends TwoHoleSocket implements ThreeHoleSocket{
@Override
public void threeHole() {
System.out.println("插入三孔插座");
}
public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.twoHole();//使用两孔插座
adapter.threeHole();//使用三孔插座
}
}
2.2 对象适配器模式
通过组合关系来实现适配器功能,ThreeHoleSocket和TwoHoleSocket没有变化
/**
* 适配器
*/
public class Adapter implements ThreeHoleSocket{
//通过组合持有两孔插座的对象,内部引用两孔插座来适配
private TwoHoleSocket twoHoleSocket;
public Adapter(TwoHoleSocket twoHoleSocket) {
this.twoHoleSocket = twoHoleSocket;
}
public void twoHole() {
twoHoleSocket.twoHole();
}
@Override
public void threeHole() {
System.out.println("插入三孔插座");
}
public static void main(String[] args) {
Adapter adapter = new Adapter(new TwoHoleSocket());
adapter.twoHole();//两孔插座
adapter.threeHole();//三孔插座
}
}
2.3 接口适配器模式
接口适配器模式也称作缺省适配模式,就是有时候一个接口的方法太多,我只想用其中的一两个,不想为其他方法提供实现,就可以通过一个抽象类为这个接口的所有方法,提供空实现,如果想用哪个方法,再提供一个子类继承这个抽象类,覆盖父类某个方法即可;
举个栗子:墙上有一个插座,支持三孔,两孔,和支持usb插口,但是我考虑到安全问题,不想把三孔和两孔插口暴漏出来,只留一个usb插口给手机充电用,应该怎么做呢?
插座接口
/**
* 墙上插座
*/
public interface HallSocket {
//两孔插口
void twoHole();
//三孔插口
void threeHole();
//usb插口
void usbHole();
}
缺省实现类
/**
* 抽象类:提供缺省实现
*/
public class AbstractAdapter implements HallSocket{
@Override
public void twoHole() {
}
@Override
public void threeHole() {
}
@Override
public void usbHole() {
}
}
目标子类
public class UsbSocket extends AbstractAdapter{
@Override
public void usbHole() {
System.out.println("usb插口");
}
//测试
public static void main(String[] args) {
UsbSocket usbSocket = new UsbSocket();
usbSocket.usbHole();
}
}
2.4 三种适配器模式的区别
- 类适配器模式:通过继承源类,实现目标接口的方式实现适配,但是由于Java单继承的机制,这就要求目标必须是接口,有一定的局限性
- 对象适配器模式,通过组合方式持有源类对象,可以把源类对象子类传进来,比类适配器模式更灵活
- 接口适配器模式,借助中间抽象类空实现目标接口所有方法,子类选择性重写,可以减少实现不必要方法
我只是偶尔安静下来,对过去的种种思忖一番。那些曾经的旧时光里即便有过天真愚钝,也不值得谴责。毕竟,往后的日子,还很长。不断鼓励自己,
天一亮,又是崭新的起点,又是未知的征程(上校9)
逆水行舟,不进,则退!