定义
适配器模式结构图

如图所示,Client不能直接访问Adaptee。Adapter是适配器,它将Adaptee转换成Client能访问的接口。所以通过适配器Adapter,用户端就可以访问Adaptee。
使用场景例子
手机想要投影到投影仪上,由于手机是Type-c接口,投影仪是VGA接口。不能直接投影,需要一个适配器,将视频信号从Type-c口转到VGA口,最后才能输出到大屏幕上。
适配器模式在使用场景的具体实现
这有一个适配器,一号口是typec口,二号口是vga口,只有将视频信号从typec口输入,转换输出到vga口,才能和投影仪对接,实现手机屏幕投影到投影仪上的任务。涉及的物品有:手机、适配器、投影仪。

定义一个手机,它有个typec口,这是视频源。
package com.jstao.adapter;
public class Phone { public void typecPhone() { System.out.println("信息从Typec口的手机输出。"); } }
|
定义一个vga接口
package com.jstao.adapter;
public interface Vga { void vgaInterface(); }
|
实现一个适配器
适配器实现方式分三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式
package com.jstao.adapter;
public class Typec2Vga1 extends Phone implements Vga{ @Override public void vgaInterface() { typecPhone(); System.out.println("接收到Type-c口信息,信息转换成VGA接口中..."); System.out.println("信息已转换成VGA接口,显示屏可以对接。"); } }
|
对象的适配器模式
package com.jstao.adapter;
public class Typec2Vga2 implements Vga{
private Phone phone; public Typec2Vga2(Phone phone) { this.phone = phone; } @Override public void vgaInterface() { if(phone != null) { phone.typecPhone(); System.out.println("接收到Type-c口信息,信息转换成VGA接口中..."); System.out.println("信息已转换成VGA接口,显示屏可以对接。"); } } }
|
接口的适配器模式
原理:借助抽象类来实现适配器功能。
package com.jstao.adapter;
public interface Target { void typec(); void typec2vga(); void typec2hdmi(); }
|
package com.jstao.adapter;
public abstract class Adapter implements Target{
public void typec() { } public void typec2vga() { } public void typec2hdmi() { } }
|
package com.jstao.adapter;
public class VgaAdapter extends Adapter{ public void typec() { System.out.println("信息从Typec口的手机输出。"); } public void typec2vga() { System.out.println("接收到Type-c口信息,信息转换成VGA接口中..."); System.out.println("信息已转换成VGA接口,显示屏可以对接。"); } }
|
package com.jstao.adapter;
public class Screen { public static void main(String[] args) { System.out.println("-------------第一种适配器------------"); Vga vga = new Typec2Vga1(); vga.vgaInterface(); System.out.println("显示屏对接适配器,手机成功投影到显示屏!"); System.out.println("-------------第二种适配器------------"); Typec2Vga2 typec2Vga1 = new Typec2Vga2(new Phone()); typec2Vga1.vgaInterface(); System.out.println("显示屏对接适配器,手机成功投影到显示屏!"); System.out.println("-------------第三种适配器------------"); VgaAdapter vgaAdapter = new VgaAdapter(); vgaAdapter.typec(); vgaAdapter.typec2vga(); System.out.println("显示屏对接适配器,手机成功投影到显示屏!"); } }
|

适配器模式在源码中的应用
总结
适配器模式将一个接口转为另外一个接口。它有三种实现方式:
当希望将一个类转换为满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可,例如4.3.1。
当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Typec2Vga2 类,持有原类的一个实例,在Typec2Vga2 类的方法中,调用实例的方法就行,例如4.3.2对象的适配器模式。
当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方法,我们写别的类的时候,继承抽象类即可,例如4.3.3接口的适配器模式。