适配器模式:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
适配器模式结构图:
四个角色
适配器分类
组合:采取组合方式的适配器成为对象适配器
特点:把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被被适配者
继承:采用继承的方式的称为类适配器
特点:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类二实现适配
以显示器中HDMI线和VGA线来为例
如果显示器只支持HDMI线 ,就需要VGA转HDMI
HDMI接口
public interface HDMI {
public void HDMISignal();
}
VGA接口
public interface VGA {
public void VGASignal();
}
HDMI实现类
public class HDMIImpl implements HDMI{
public void HDMISignal(){
System.out.println("使用HDMI信号线");
}
}
VGA实现类
public class VGAImpl implements VGA{
public void VGASignal(){
System.out.println("使用VGA信号线");
}
}
vga转hdmi 适配器
public class VGAAdapter implements HDMI {
private VGA vga;
public VGAAdapter(VGA vga){
this.vga =vga;
}
@Override
public void HDMISignal() {
System.out.println("通过转换");
vga.VGASignal();
}
}
显示器
public class Display {
private HDMI signal;
public Display(HDMI signal){
this.signal =signal;
}
//使用信号线连接显示器
public void charge(){
signal.HDMISignal();
}
public static void main(String[] args) {
//显示器只支持hdmi,使用vga线,通过适配器把vga转hdmi
VGA vga =new VGAImpl();
HDMI hdmi =new VGAAdapter(vga);
Display display =new Display(hdmi);
display.charge();
}
}
继承的方式写一下 HDMI转VGA
public class HDMIAdapter extends HDMIImpl implements VGA {
@Override
public void VGASignal() {
this.HDMISignal();
}
}
接口适配器模式
接口
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
抽象类适配器(空实现接口)
//在AbsAdapter 我们将 Interface4 的方法进行默认实现
public abstract class AbsAdapter implements Interface4 {
//默认实现
public void m1() {
}
public void m2() {
}
public void m3() {
}
public void m4() {
}
}
客户端(通过匿名内部类来覆盖我们需要的接口方法)
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
//只需要去覆盖我们 需要使用 接口方法
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println("使用了m1的方法");
}
};
absAdapter.m1();
}
}
作用
透明:通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样更加简单、更直接、更紧凑
重用:复用现存的类,解决了现存类和复用环境要求不一致的问题。
低耦合:将目标类和适配者类解耦,通过引入一个适配器类重用现在的适配者类,而无修改原有代码(遵循开闭原则)