设计模式之适配器模式Java实现

适配器模式(Adapter Pattern)
意图:
将一个类的接口转换客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
分类:
结构型模式


结构型模式(Structural Pattern):
描述如何将类或者对象结合形成一个更大的结构。

别名:
Wrapper–包装器
适用性:

1.你想使用一个已经存在的类,而它的接口不符合你的需求。
1. 你想创建一个可以复用的类,该类可以与其他不相关的类和不可预见的类(那些接口可能不一定兼容的类)协同工作。
2. (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以及匹配到它们的接口。对象Adapter可以适配它的父类接口。


适配器分为类适配器和对象适配器


类适配器示例:

适配器模式 android 适配器模式java_适配器模式 android

示例代码:

public interface Voltage5vInterface {
    public void connect5v();
}
public class Voltage220v{
    public void connect220v() {
        System.out.print("接通220v电源,");
    }
}
public class PowerAdapter extends Voltage220v implements Voltage5vInterface{
    @Override
    public void connect5v() {
        connect220v();
        System.out.print("将220v电源转化为5v电源,");
    }
}

public class Phone {
    private Voltage5vInterface voltage5v;
    public Phone(Voltage5vInterface voltage5v){
        this.voltage5v = voltage5v;
    }
    public void charge(){
        voltage5v.connect5v();
        System.out.println("已经接通电源,手机开始充电");
    }
}
public class AdapterPatternDemo {
    public static void main(String[] args) {
        PowerAdapter adapter = new PowerAdapter();
        Phone phone = new Phone(adapter);
        phone.charge();
    }
}

运行结果
接通220v电源,将220v电源转化为5v电源,已经接通电源,手机开始充电



对象适配器示例:

类图

适配器模式 android 适配器模式java_适配器模式_02


示例代码

public interface Voltage5vInterface {
    public void connect5v();
}
public class Voltage220v{
    public void connect220v() {
        System.out.print("接通220v电源");
    }
}
public class PowerAdapter implements Voltage5vInterface{
    private Voltage220v Voltage220v;
    public PowerAdapter(Voltage220v voltage220v) {
        this.Voltage220v = voltage220v;
    }
    @Override
    public void connect5v() {
        Voltage220v.connect220v();
        System.out.print("将220v电源转化为5v电源");
    }
}
public class Phone {
    private Voltage5vInterface voltage5v;

    public Phone(Voltage5vInterface voltage5v){
        this.voltage5v = voltage5v;
    }

    public void charge(){
        voltage5v.connect5v();
        System.out.println("已经接通电源,手机开始充电");
    }
}

public class AdapterPatternDemo {
    public static void main(String[] args) {
        Voltage220v voltage220v = new Voltage220v();
        PowerAdapter adapter = new PowerAdapter(voltage220v);
        Phone phone = new Phone(adapter);
        phone.charge();

    }
}

运行结果:
接通220v电源将220v电源转化为5v电源已经接通电源,手机开始充电


类图

适配器模式 android 适配器模式java_适配器_03


示例代码:

//接口:电脑接口
public interface ComputerInterface {
      void USB();
}
public class XiaomiPhone {
    public void xiaoMiInterface(){
        System.out.println("小米手机的数据接口");
    }
}
public class SamsungPhone {
    public void samungInterface(){
        System.out.println("三星手机的数据接口");
    }
}
//三星手机数据线适配器
public class SamungDataWireAdapter extends SamsungPhone implements ComputerInterface {
    @Override
    public void USB() {
        System.out.print("使用三星数据线连接");
        super.samungInterface();
    }
}
//小米手机数据线适配器
public class XiaomiDataWireAdapter extends XiaomiPhone implements ComputerInterface {
    @Override
    public void USB() {
        System.out.print("使用小米数据线连接");
        super.xiaoMiInterface();
    }
}

public class AdapterPatternDemo {
    public static void main(String[] args) {
        ComputerInterface computer =new SamungDataWireAdapter();
        computer.USB();
        computer=new XiaomiDataWireAdapter();
        computer.USB();
    }
}

运行结果

使用三星数据线连接三星手机的数据接口
使用小米数据线连接小米手机的数据接口

优先使用(对象)组合,而非(类)继承