适配器模式
一、概述
将一个类的接口转换成客户希望的另外一个接口, Adapter模式使得原本由于接口不兼容而不能一起工作
那些类可以在一起工作
当两种不同设备要进行沟通时,需要一个**中间量(转换器)**的来实现他们的连接,例如:USB网线转换器等。
代码
以USB网线转换器为例
这里采用继承方式(类适配器,单继承,存在弊端)
1.事先规定一个接口用于处理请求
//先造一个转换接口
//接口转换器的抽象实现
public interface NetToUsb {
//处理转换请求的方法;
public void handleRequest();
}
2.找到要被适配的对象(这里指的是网线)
//要被适配的网线
public class Net {
//该设备的请求
public void request() {
System.out.println("连接网线,上网");
}
}
3.写出真正的适配器的适配方法
//真正的适配器
//既要连接网线还要连接USB
//因此这个类需要实现NetToUsb接口
//又因为它要处理上网的请求,因此采用继承Net类
public class Adapter extends Net implements NetToUsb {
//根据网线类的请求来处理转换请求
@Override
public void handleRequest() {
//直接调用父类(网线)的上网请求方法
super.request();
}
}
4.生成一个需要适配器的客户端类
//电脑要上网
public class Computer {
//实现上网功能,需要转换器(参数)
public void net(NetToUsb netToUsb) {
//需要一个转接头,因此传递一个NetToUsb接口
//通过转接器间接处理请求;
netToUsb.handleRequest();
}
}
测试
public class Test {
public static void main(String[] args) {
//需要一根网线;
Net net = new Net();
//需要一台电脑;
Computer computer = new Computer();
//需要一个适配器;
Adapter adapter = new Adapter();
//这里可以形象是看成:电脑(computer)要上网(net)需要适配器(adapter)。
computer.net(adapter);
}
}
这里采用组合方式(对象适配器,推荐)
public interface TransitionInterface {
//转换请求
void transitionRequest();
}
//需要被适配的设备(如:网线)
public class Equipment2 {
//有自己的功能请求
public void myRequest() {
System.out.println("我的功能请求是---------");
}
}
这里没有采用继承方式,而是通过传递对象类(需要被适配的类)。
//真正的适配器
public class Adapter implements TransitionInterface {
private Equipment2 equipment2;
public Adapter(Equipment2 equipment2) {
this.equipment2 = equipment2;
}
//通过该方法,进行请求转换
@Override
public void transitionRequest() {
equipment2.myRequest();
}
}
设置客户端
//设备(如:电脑)
public class Equipment1 {
//需要一个转换器接口,实现该设备想要完成的功能
public void function(TransitionInterface transition) {
//通过转换器处理转换请求
transition.transitionRequest();
}
}
public class Test {
public static void main(String[] args) {
Equipment1 equipment1 = new Equipment1();
Equipment2 equipment2 = new Equipment2();
Adapter adapter = new Adapter(equipment2);//对象类适配器
equipment1.function(adapter);
}
}
二、角色分析
1.目标接口
客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口
2.被适配的类
需要适配的类或适配者类
3.适配器
通过包装一个需要适配的对象,把原接口转换成目标对象!
三、总结
1.对象适配器优点
A.一个对象适配器可以把多个不同的适配者适配到同一个目标(客户端)。
B.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者
的子类也可通过该适配器进行适配。
2.类适配器缺点
A.对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适
配者。
B.在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
3.适用场景
A.系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源
代码。
B.想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。