设计模式——Adapter适配器模式
适配器模式
适配器模式将一个类的接口,转换成客户期望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。即解决不兼容、不匹配的问题而引人的。可以作为两个不兼容的接口之间的桥梁。
比如笔记本是三头插头,但现在只有两头插座,就需要一个电源适配器将三头转成两头。
适配器模式有两种:类适配器模式(使用继承的适配器)和对象适配器模式(使用委托的适配器)
类适配器模式
类适配器也就是继承的适配器,顾名思义,就是让适配器继承和实现类和接口,来关联两个不兼容的功能方法。
模拟双孔插座供电
public class PowerSource { //模拟插座供电功能,这是双孔插座 public void duplexOutlet() { System.out.println("供电"); } }
PC的电源三头插头
public interface PcPower { //pc电源是三头插座 public abstract void triplexHead(); }
电源适配器,将三头转换成双头
public class PowerAdapter extends PowerSource implements PcPower { @Override //模拟电源适配器,将三头转换成双头 public void triplexHead() { duplexOutlet(); } }
测试电源供电
public class Test { public static void main(String[] args) { PcPower pcPower = new PowerAdapter(); pcPower.triplexHead(); } }
对象适配器模式
对象适配器也就是委托适配器。委托在Java中是指将某个方法中的实际处理交给其他实例。由于Java不能同时继承两个类,所以可以将不兼容的功能类加入到自己的成员属性中。
模拟双孔插座供电
public class PowerSource { //模拟插座供电功能,这是双孔插座 public void duplexOutlet() { System.out.println("供电"); } }
PC的电源三头插头,这里改为抽象类
public abstract class PcPower { //pc电源是三头插座 public abstract void triplexHead(); }
电源适配器,将三头转换成双头,使用组合的形式,将PowerSource作为适配器的成员。
public class PowerAdapter extends PcPower { private PowerSource powerSource; public PowerAdapter(){ powerSource = new PowerSource(); } @Override //模拟电源适配器,将三头转换成双头 public void triplexHead() { powerSource.duplexOutlet(); } }
测试电源供电
public class Test { public static void main(String[] args) { PcPower pcPower = new PowerAdapter(); pcPower.triplexHead(); } }
Java I/O中的适配器模式
Java I/O中有很多适配器模式的应用,如将字符串数据变成字节数据保存到文件中,将字节数据变成流数据等。例如InputStreamReader和OutputStreamWriter分别继承了Reader和Writer接口,要创建它们的对象必须在构造函数中传入一个InputStream和OutputStream的实例。也就是将InputStream和OutputStream适配到Reader和Writer。
总结
为什么要使用适配器模式?如果某个方法就是我们所需的方法,直接在程序中使用不就可以了吗?因为我们开发过程中会使用很多现成已经很成熟的类作为组件重复利用。发现Bug的话也知道不会在适配器中,因为组件都是成熟的类。对于系统版本的升级与兼容,经常会用到适配器模式。当然,如果两个类或接口的功能是完全不相同的,就像我们不会想让双孔插座里流出自来水一样。