一、含义
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间,也就是说适配器模式是在原有一个类的基础上,在不改变这个类的代码时,新建一个类将其原来的类,进行封装改变,以符合新的需求。
二、要点
1.当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。
2.适配器模式有两种形式:对象适配器和类适配器。类适配器需要用到多重继承来实现,所以在java中只能实现对象适配器,java不支持多重继承。
3.实现一个适配器的复杂程度,是根据在要实现的目标接口的大小和复杂度而定的。
三、实战分析适配器模式
首先来看一下适配器模式的类图:
我们看看一个古话,叫做挂羊头卖狗肉,其实就可以用适配器模式来实现,首先我们需要实例一个通用的羊的接口和一个具体的羊的实现类
//这是一个羊的接口
public interface Sheep {
//羊肉的味道
public void taste();
//羊的外观
public void appearance();
}
//一个羊的具体实现类
public class Goat implements Sheep {
@Override
public void taste() {
System.out.println("我的味道很鲜美");
}
@Override
public void appearance() {
System.out.println("我有一对羊角");
}
}
然后就是实例一个狗的接口和一个具体的类
//这个一个狗的实例
public interface Dog {
//狗肉的味道
public void taste();
//狗的外观
public void appearance();
}
//这是一个具体的狗的实体
public class RuralDog implements Dog {
@Override
public void taste() {
System.out.println("狗肉的味道");
}
@Override
public void appearance() {
System.out.println("狗头狗脑的");
}
}
因为羊肉的价格贵一点,所以就用狗肉去充当羊肉去卖,这个时候就需要一个适配器,将狗肉转换成羊肉去买,适配的代码如下:
//适配器需要实现目标接口,也就是羊的接口
public class DogAdapte implements Sheep {
//需要一个被转化的对象,也就是一条狗的实例
Dog dog;
public DogAdapte(Dog dog) {
this.dog = dog;
}
@Override
public void taste() {
dog.taste();
}
@Override
public void appearance() {
dog.appearance();
}
}
最后编写代码来测试一下:
public class SheepTest {
public static void main(String[] args) {
Goat goat = new Goat();
RuralDog ruralDog = new RuralDog();
Sheep dogAdapte = new DogAdapte(ruralDog);
System.out.println("DogAdapte says:");
testSheep(dogAdapte);
}
static void testSheep(Sheep sheep) {
sheep.taste();
sheep.appearance();
}
}
测试结果如下:
DogAdapte says:
狗肉的味道
狗头狗脑的
调用的是狗的味道,但返回给客户是一个羊的对象,这就是挂羊头卖狗肉,看着是个羊,买的其实是狗肉。