适配器模式
定义
将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以在一起工作
类型
结构型
适用场景
已经存在的类,他的方法和需求不匹配时(方法结果相同或者相似)
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下维护方案
优点
能提高类的透明性和复用,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序扩展性
符合开闭原则
缺点
适配器编写过程需要全面考虑,可能会增加系统的复杂性
增加系统代码可读的难度
代码
类适配器模式
// 被适配者
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
// 适配者接口
public interface Target {
void request();
}
// 接口的实现类
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
// 适配器
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
对象适配器模式
// 被适配者
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
// 适配接口
public interface Target {
void request();
}
// 适配者实现类
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
// 适配器
public class Adapter implements Target{
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
实例:变压器
// 220V 电压
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出交流电 " + output + "V");
return output;
}
}
// 适配5V的电压
public interface DC5 {
int outputDC5V();
}
// 适配器
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
int adapterOutput = adapterInput / 44;
System.out.println("使用变压器:" + adapterInput + "V; 输出:" + adapterOutput);
return adapterOutput;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
输出结果:
输出交流电 220V
使用变压器:220V; 输出:5Process finished with exit code 0