1 适配器模式介绍
适配器模式(Adapter Pattern)属于结构型模式(结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。)。
将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作
📌 场景
当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时;
当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时。
📌 适配器模式中出现的角色
在适配器模式中,主要存在四个角色
Target—NetToUsb(目标):目标定义了请求者所要使用的功能,是一种标准,具体实现可交由不同的适配器采用不同的方法进行实现;
Adapter—(适配器):负责实现转换功能的对象,同时其功能的实现需要符合目标中定义的标准;
Adaptee—NetLine(被适配的对象):需要被适配器转换的对象;
Client—Computer(请求者):即需要使用适配器的对象,本文是直接调用NetToUsb,由适配器来具体实现,而不用关心适配的具体过程。
适配器模式分为类适配器和对象适配器。
2 类适配器
📌 UML图
![](https://img-blog.csdnimg.cn/img_convert/49ba7f4f66e71140bca65b378c751113.png)
📌1.定义电脑
/**
* 电脑
* <p>想上网,需要插网线
*/
public class Computer{
/**
* 电脑需要连接上转换器才可以上网
*/
public void connect(NetToUsb adapter){
// 上网的具体实现,找一个转接头
adapter.connectNetLine();
}
}
📌2.定义usb转网口转接器
/**
* 转接器
*/
public interface NetToUsb {
/**
* 处理请求,usb -> 网线
*/
void connectNetLine();
}
📌3.定义网线
/**
* 网线
*/
public class NetLine {
/**
* 上网
*/
public void online(){
System.out.println("连接网线上网");
}
}
📌4.定义类适配器
/**
* 类适配器
*/
public class ClassAdapter extends NetLine implements NetToUsb{
@Override
public void connectNetLine() {
// 可以上网了
super.online();
}
}
📌5.使用
// 电脑
Computer computer = new Computer();
// 转接器已经插上网线
ClassAdapter adapter = new ClassAdapter();
// 电脑连接转接器,成功上网
computer.connect(adapter);
这种实现方式的适配器需要占用一个继承位。如果此时 NetToUsb 不是接口而是抽象类的话,由于 Java 不支持多继承,就无法实现了。同时根据合成复用原则,应该更多的通过合成的方式去实现功能。
3 对象适配器
这是更为常用的一种模式。
📌 UML图
![](https://img-blog.csdnimg.cn/img_convert/4dc8f702ddb9a676556fd51788d3c7d3.png)
前三步照旧~
📌5.定义对象适配器
public class ObjectAdapter implements NetToUsb{
//网线
private NetLine netLine;
public ObjectAdapter(NetLine netLine){
this.netLine = netLine;
}
@Override
public void connectNetLine() {
// 可以上网了
netLine.online();
}
}
📌5.使用
// 电脑
Computer computer = new Computer();
// 网线
NetLine netLine = new NetLine();
// 转接器插上网线
ObjectAdapter adapter = new ObjectAdapter(netLine);
// 电脑连接转接器,成功上网
computer.connect(adapter);
这样的方式不会占用继承位,且满足合成复用原则,耦合度更低,也更加灵活,推荐使用。