【开场白】
这是一个与魔术相关的主题。
有一个故事是如何把火鸡变成鸭子,这是一个神奇的故事
【what】
适配器模式是什么?
适配器模式将一个类的接口转换成客户期望的另一个接口
【How】
①首先,鸭子接口
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:03:04
* @Email
* @Description: 适配器模式-鸭子接口
*/
public interface IDuck {
public void quack();
public void fly();
}
实现鸭子接口的-绿头鸭类
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:10:59
* @Email
* @Description: 绿头鸭
*/
public class MallardDuck implements IDuck {
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack---->");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying.");
}
}
②火鸡接口
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:13:08
* @Email
* @Description: 火鸡
*/
public interface ITurkey {
/**
* 火鸡咯咯叫
*/
public void gobble();
public void fly();
}
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:14:57
* @Email
* @Description: TODO(用一句话描述该文件做什么)
*/
public class Turkey implements ITurkey {
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble.");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a short distance.");
}
}
③
重点来了-适配器类
【敲黑板】
1>适配器角色是一个类而不是接口
2>适配器类实现了目标对象接口,本例中是鸭子接口
3>适配器类拥有被适配对象实例
魔术师开始你的表演
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:17:05
* @Email
* @Description: 适配器类-把火鸡变成鸭子
*/
public class TurkeyAdapter implements IDuck {
ITurkey turkey;
public TurkeyAdapter(ITurkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
turkey.fly();
}
}
④测试类
/**
* @author
* @version V1.0
* @Date 2017年11月29日 下午8:25:26
* @Email
* @Description: 测试类
*/
public class DuckTest {
public static void testDuck(IDuck duck){
duck.quack();
duck.fly();
}
public static void main(String[] args) {
IDuck duck = new MallardDuck();
ITurkey turkey = new Turkey();
testDuck(duck);
/*见证奇迹的时刻*/
IDuck turkeyAdapter = new TurkeyAdapter(turkey);
testDuck(turkeyAdapter);
}
}
【Why】
为什么需要适配器模式?
可以通过适配器模式进行接口转换,让不兼容的接口变成兼容,这可以让客户从实现的接口解耦。
客户不必为了应对不同的接口而每次跟着修改。
【举个栗子】
假设你的程序中需要调用别人模块中的一个接口,但是该接口已经存在很长时间了,需要做一些小改变才能符合你的要求;
现实中这种情况原有模块的开发人员是不会给你修改原有接口的,很可能原来开发的人早就离职了。
那么这时你就需要适配器模式了,自己写一个适配器的类实现目标接口,把原有接口对象作为适配器类既有属性。这样就实现了兼容。