一、适配器模式:将一个的接口转换成客户端希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作(类似我们的转换头)
二、模式中的角色:
(1)目标接口:客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
(2)需要适配的类:需要适配的类或适配者类
(3)适配器:通过包装一个需要适配的对象,把原接口转化为目标接口
三、实现方式:(1)类的适配器模式(采用继承实现)(2)对象适配器模式(采用对象组合方式实现)
(1)类适配器模式
类图:
//已经存在的但是1不符合标准接口的类
class Adaptee{
public void specificRequest() {
System.out.println("被适配类,具有特殊功能。。。");
}
}
//目标接口,或称为标准接口
interface Target{
public void request();
}
//具体目标类,只提供普通功能
class ConcreteTarget implements Target{
public void request() {
System.out.println("普通类,具有普通功能。。。");
}
}
//适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
@Override
public void request() {
// TODO 自动生成的方法存根
super.specificRequest();
}
}
public class AdapterDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
//使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
}
(2)对象适配器模式
类图:
//适配器类,直接关联被适配器类,同时实现标准接口
class Adapter0 implements Target{
//直接关联被适配类
private Adaptee adaptee;
//可以通过构造函数传入具体需要适配的被适配类对象
public Adapter0(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
// TODO 自动生成的方法存根
//这里使用委托的方式完成特殊功能
this.adaptee.specificRequest();
}
}
public class AdapterDemoAnother {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
//使用特殊功能类,即适配器
//需要创建一个被适配类的对象作为参数
Target adapter = new Adapter0(new Adaptee());
adapter.request();
}
}
四、适配器的好处:
(1)这样更简单,更直接,更紧凑
(2)复用了现存的类,解决了现存类和复用环境要求不一致的问题
(3)将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码
缺点:更换适配器的过程比较复杂