适配器模式
定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
我们周围的适配器
最常见的例子是三孔插座和两孔插座,如果墙上有一个三孔插座,但是我们的充电器又只能使用两孔的插座,那么我们通常是接一条带有两孔和三孔的插座其插头是三个的,以适应不同的需求。
面向对象适配器
假设已有一个软件系统,你希望它能和一个新的厂商类库搭配使用,但是这个新厂商的接口不同于旧厂商的接口,不改变现有代码,如何解决这个问题?写一个类,将新厂商接口转接成你所期望的接口。
这个适配器实现了你的类所期望的接口,而且也能和厂商的接口沟通。
火鸡适配器
现在假设你缺鸭子对象,想用一些火鸡对象冒充。这两个对象接口不同,不能直接用,所以来写个适配器吧。
先看鸭子接口
public interface Duck{
public void quack();
public void fly();
//鸭子接口具备呱呱叫和飞行的能力
}
绿头鸭是鸭子的子类
public class MallardDuck implements Duck{
public void quack()
{
System.out.println(“Quack”);
}
public void fly()
{
System.out.println(“I’mflying”);
}
火鸡接口
public interface Turkey{
public void gobble();//火鸡不会呱呱叫,只会咯咯叫
public void fly();//火鸡会飞,虽然飞不远
}
火鸡的具体实现类
public class WildTurkey implements Turkey{
public void gobble()
{
System.out.println(“gobblegobble”);
}
public void fly()
{
System.out.println(“I’mflying a short distance”);
}
火鸡适配器
//首先,要实现想转换成的类型接口,也就是你的客户所期望看到的接口
public class TurkeyAdapter implements Duck{
Turkey turkey;
//接着,要取得适配的对象的引用
public TurkeyAdapter(Turkeyturkey){
this.turkey = turkey;
}
//实现接口中所有的方法
public void quack(){
turkey.gobble();
}
//火鸡的飞行距离很短,不像鸭子可以长途飞行,
//要让鸭子和火鸡的飞行对应,必须连续五次调用火鸡的fly来完成
public void fly(){
for(inti=0;i<5;i++){
turkey.fly();
}
}
}
测试适配器
public class DuckTestDrive{
public static voidmain(String[] args){
//创建一只鸭子
MallardDuck duck = new MallardDuck();
//创建一只火鸡
WildTurkey turkey = new WildTurkey();
//将火鸡包装进火鸡适配器中,使它像一只鸭子
DuckturkeyAdapter = new TurkeyAdapter(turkey);
//测试这只火鸡,让它咯咯叫,让它飞行
System.out.println("the Turkey says ...");
turkey.gobble();
turkey.fly();
//调用testDuck方法来测试鸭子
System.out.println("\nthe duck says...");
testDuck(duck);
//传入一只假装是鸭子的火鸡
System.out.println("\n the turkeyAdapter says ...");
testDuck(turkeyAdapter);
}
public static voidtestDuck(Duck duck){
duck.quack();
duck.fly();
}
}