一、适配器模式动机:
在现实生活中,经常存在一些不兼容的事物。如某些电器的工作电压与家庭交流电电压不一致、网络速度与计算机处理速度不一致、某硬件设备提供的接口与计算机支持的接口不一致等。在这种情况下,我们可以通过一个新的设备来使原本不兼容的事务可以在一起工作,这个新的设备称之为适配器。在软件开发中,也存在一下不一致的情况,同样,也可以通过这种称之为适配器模式的设计模式解决问题。
二、适配器模式定义:
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器。
三、适配器模式分类:
类适配器模式和对象适配器模式。
1、类适配器模式结构图:
由类适配器模式结构图知,在类适配器中,提供了一个适配器类Adapter,适配器类实现了抽象目标类的接口,并继承了适配者类Adaptee,在适配器类的request()方法中调用了所继承的适配者的specificRequest()方法,实现了适配的目的。 因为适配者类与适配器是继承关系,所以这种适配器模式被称为类适配器模式。
适配器类:Adapter
public class Adapter extends Adaptee implements Target{
public void request() {
specificRequest();
}
}
目标接口:
public interface Target{
public void request();
}
适配者类:
public class Adptee {
public void specificRequest() {
System.out.println("想要的请求");
}
}
测试类:
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
类适配器模式的优点:
(1)将目标类与适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无需修改原有代码。
(2)增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端来说是透明的,而且提高了适配者的复用性。
(3)灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
(4)有与适配器类时适配者的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
类适配器的缺点:
对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和它的子类同时适配到目标接口
2.对象模式结构图
由对象适配者模式结构图知,在对象适配器中,提供了一个适配器类Adapter,该类继承了抽象目标类,并且包含了一个适配者实例,从而将客户端与与适配者衔接起来,在适配器的request()方法调用适配者的specificRequest()方法。因为适配器类与适配者类时关联关系,所以这种适配器模式被称为对象适配器模式。
对象适配器类:
public class Adapter extends Target{
//引用适配者类
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
adaptee.speicificRequest();
}
}
抽象目标类:Target
public abstract class Target {
public abstract void request();
}
适配者类:Adaptee
public class Adaptee {
public void speicificRequest() {
System.out.println("真正想要的方法!!!");
}
}
测试类:Client
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
对象适配器的优点:
也具有类适配器的(1)(2)(3)一致。
对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类同时适配到目标接口。
对象适配器的缺点:
(1)与类适配器相比,要想置换适配者类的方法不容易。
(2)如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后在把适配者类的子类当作真正的适配者进行适配,实现过程较为复杂。
四:模式适用的环境
(1)系统需要使用现有的类,而这些类的接口不符合系统的需要。
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。