定义:
将一个类的接口转换成客户端期望的另一个接口。适配器模式可以消除由于接口不匹配所造成的类兼容性问题。
简单的讲就是客户期望调用我们已存的代码功能,但客户已经定义好了自己的接口标准,为了使我们已有的代码能适用客户的接口,所以需要用到适配器模式。
该模式定义的角色有一下三种:
适配器模式主要以两种方式实现:
举个生活中常见的例子: 为手机充电。
手机需要电但无法直接从电源上获得(这里忽略带交流电源的山寨手机),所以有了充电器这个适配器,来适配手机与电源的接口,从而能正常充电。
1.类适配器
Target(手机充电接口):
public interface Target { public void electricize(); }
Adaptee(电源):
public class Adaptee { public void getElectricity() { System.out.println("获取电流......"); } }
Adapter(适配器):
public class AdapterClass extends Adaptee implements Target{ public void electricize() { this.getElectricity(); } }
Test:
public class Test { public static void main(String args[]) { AdapterClass adapterClass = new AdapterClass(); adapterClass.electricize(); } }
2.对象适配器
更换Adapter代码为以下:
public class AdapterObject implements Target{ private Adaptee adaptee; public AdapterObject(Adaptee adaptee) { this.adaptee = adaptee; } public void electricize() { adaptee.getElectricity(); } }
Test:
public class Test { public static void main(String args[]) { AdapterObject adapterObject = new AdapterObject(new Adaptee()); adapterObject.electricize(); } }
类适配器与对象适配器:
整体看类适配器是基于集成的概念,而对象适配器更类似于一种组合的概念。
对象适配器的一些应用场景:
当客户无法给出明确接口或客户提出的接口为抽象类时。
客户接口:
public abstract class AbstractTarget { abstract public void electricize(); }
适配器:
public class AdapterObject extends AbstractTarget { private Adaptee adaptee; public AdapterObject(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void electricize() { adaptee.getElectricity(); } }