适配器模式,顾名思义,起适配的作用,它类似于我们的手机充电适配器,将220V的电压转换成5v的电压。当然,在编程的世界里,是不存在电压的,而是将不同的接口进行适配
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口。使得原本接口不兼容的类可以一起工作。适配器模式是对象结构型模式
适配器模式中的接口是广义上的接口,它可以表示一个方法、或方法的集合。适配器模式通过增加一个新的适配器类来解决接口不兼容问题,使原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为类适配器模式和对象适配器模式。在类适配器模式中,适配器与适配者间是继承或实现的关系;而在对象适配器模式中,适配器与适配者间是关联关系。实际开发中,对象适配器使用频率更高
完成适配器模式需要3个角色
目标抽象类(Target):定义客户需要的接口、抽象类或具体的类
适配器类(Adapter):可以调用另一个接口,是适配器模式的核心
适配者类(Adaptee):被适配的角色,一般是一个具体的类
适配器模式中,根据适配器类与适配者类的关系不同,适配器模式可分为类适配器模式和对象适配器模式。在类适配器模式中,适配器与适配者之间是继承或实现的关系;在对象适配器模式中,适配器与适配者之间是关联关系。实际开发中,对象适配器模式使用频率更高
下面代码演示适配器模式
类适配器模式
定义目标抽象类
package com.design.structural.adapter.classadapter;
/**
* 目标抽象类
*/
public interface Target {
void request();
}
定义适配者类
package com.design.structural.adapter.classadapter;
/**
* 适配者类
*/
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配的方法");
}
}
定义适配器类
package com.design.structural.adapter.classadapter;
/**
* 适配器类
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
类图如下
测试调用类
package com.design.structural.adapter.classadapter;
public class TestMain {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
对象适配器模式
定义目标抽象类
package com.design.structural.adapter.objectadapter;
/**
* 目标抽象类
*/
public interface Target {
void request();
}
定义适配者类
package com.design.structural.adapter.objectadapter;
/**
* 适配者类
*/
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配的方法");
}
}
定义适配器类
package com.design.structural.adapter.objectadapter;
/**
* 适配器类
*/
public class Adapter implements Target{
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
类图如下
测试调用类
package com.design.structural.adapter.objectadapter;
public class TestMain {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
适配器模式总结
优点:将目标类与适配者类解耦;增加了类的复用性和透明性;符合开闭原则
缺点:适配器模式编写需要全面考虑,增加系统复杂性;使代码可读性降低
适用场景:已经存在的类,它的方法和需求不匹配;在软件维护中,接口不同的解决方案