适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
回想之前博客中鸭子的例子,这里有一个鸭子的接口,和一个鸭子的子类。
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("fly");
}
}
下面是火鸡的接口和子类
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("gobble");
}
public fly() {
System.out.println("I'm flying a short distance");
}
}
现在我们缺鸭子对象,想用火鸡冒充。但是接口不同,所以不能直接来用。我们就可以做个适配器。
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
for (int i=0; i<5; i++) {
turkey.fly();//火鸡飞的比较短,所以多飞几次
}
}
}
下面是测试类,先火鸡测试,然后是鸭子的测试。最后就拿火鸡适配器来测试。
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("Duck says...");
testDuck(duck);
System.out.println("TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}