设计模式(8)适配器模式

适配器模式可以将一个类的接口,转换成客户期望的另外一个接口,让原本接口不兼容的类可以合作无间。

现在我们有一个电视的类,新版电视的开关接口和老版电视的开关是不一样的,客户想要接着用老版电视的开关模式来操作新版电视,这时候就能用适配器模式来解决这个问题。

适配器模式可以分为对象适配器、类适配器和接口适配器三种,接下来先看看对象适配器,对象适配器是重新创建一个适配器类,实现了原先接口的方法,同时有一个新版电视对象,实现原先接口中的方法调用新版电视的方法。

我们设计一个NewTVAdapter的对象,实现TV接口,然后去调用NewTV的方法,具体代码如下

public interface TV {

    public void on();

    public void off();
}
TV
public class OldTV implements TV {

    @Override
    public void on() {
        System.out.println("打开了老式电视!");
    }

    @Override
    public void off() {
        System.out.println("关闭了老式电视!");
    }
}
OldTV
public class NewTV {
    public void onTV() {
        System.out.println("打开了新款电视!");
    }

    public void offTV() {
        System.out.println("关闭了新款电视!");
    }
}
NewTV
public class NewTVAdapter implements TV {

    private NewTV newTV;

    public NewTVAdapter(NewTV newTV) {
        this.newTV = newTV;
    }

    @Override
    public void on() {
        newTV.onTV();
    }

    @Override
    public void off() {
        newTV.offTV();
    }
}
NewTVAdapter

测试代码

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();

        NewTV newTV = new NewTV();
        tv1 = new NewTVAdapter(newTV);
        tv1.on();
        tv1.off();
    }

测试结果

还有一种类适配器,创建一个适配器类,继承新版电视,同时实现老版开关的接口,接口方法里调用父类的开关方法

其他代码一样,就是适配器代码有所改变

public class NewTVAdapterClass extends NewTV implements TV {

    @Override
    public void on() {
        super.onTV();
    }

    @Override
    public void off() {
        super.offTV();
    }
}
NewTVAdapterClass

测试代码

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();
        
        tv1 = new NewTVAdapterClass();
        tv1.on();
        tv1.off();
    }

测试结果

还有一种接口适配器,它只有某一个或者某几个方法,对其他的方法并不关心。(当然作为一个电视,只有一个关闭功能显然不合理,这里只是做一个例子)

代码如下

public abstract class NewTVAdapterAbstract implements TV {
    @Override
    public void on() {

    }

    @Override
    public void off() {

    }
}
NewTVAdapterAbstract
public class NewTV2 extends NewTVAdapterAbstract{
    @Override
    public void off() {
        System.out.println("新版的关闭方式!");
    }
}
NewTV2

测试代码

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();

        tv1 = new NewTV2();
        tv1.on();
        tv1.off();
    }
}

测试结果

适配器模式将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构,增加了类的透明性和复用性,扩展性很好。

原文地址:https://www.cnblogs.com/oeleven/p/10549817.html