一、概念
如果系统中存在不兼容的接口,可以通过引入一个适配器使原本不兼容的两个类可以一起工作,而无需修改现有事务的内部结构。
举例说明,生活电压时220V,但是手机、电脑的电压没有这么高,为了使它们也能使用220V的生活电压,需要电源适配器(变压器),使得手机和电脑可以与生活用电兼容。
适配器模式中定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器,它所包装的对象就是是适配者,即被适配的类。
适配器模式分类适配器和对象适配器
二、角色
1.目标抽象类(Target)
用户要用的特定领域的接口,可以是抽象类和接口或具体类。在类适配器中,由于java不支持多重继承,只能是接口。
2.适配者类(Adaptee)
适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类型的源码
3.适配器类(Adapter)
可以调用另一个接口作为转换器,对Traget和Adaptee进行适配,是适配器模式的核心。
在类适配器中,通过实现Target接口并继承Adaptee类来使二者产生关系;
在对象适配器中,通过继承Target并关联一个Adaptee对象使二者产生联系。
三、举例说明
类适配器:现有一个机器人作为抽象类,具备的抽象方法有叫(cry)和移动(move)。另有一个狗类,有具体方法叫(wang)和跑(run)。现需要用机器人实现的业务方法是狗类中的方法。则创建一个适配器类来实现机器人接口,通过继承狗类从而调用狗这个父类的方法,在cry()里调用wang(),在move()里调用run()。
public interface Robot { public void cry(); public void move(); } class Dog{ public void wang() { System.out.println("狗汪汪叫"); } public void run() { System.out.println("狗跑"); } } class DogAdapter extends Dog implements Robot{//类适配器模式 public void cry() { System.out.println("仿生机器人:"); super.wang(); } public void move() { System.out.println("仿生机器人:"); super.run(); } }
对象适配器:在适配器类里定义一个适配者狗类对象(关联),需要使用适配者方法的时候通过对象dog直接调用。另外继承或实现抽象目标类(或接口)。
package shipeiqi; public interface Robot { public void cry(); public void move(); } class Dog{ public void wang() { System.out.println("狗汪汪叫"); } public void run() { System.out.println("狗跑"); } } class DogAdapter implements Robot{ private Dog dog;//对象适配器模式 public DogAdapter() { dog=new Dog(); } public void cry() { System.out.println("仿生机器人:"); dog.wang(); } public void move() { System.out.println("仿生机器人:"); dog.run(); } }
类适配器模式需要通过super调用,这里通过对象调用,不能多重继承,个人觉得用对象适配器比较好。