摘自《Header First设计模式》文中的源码
定义一个鸭子的模型接口:
Duck.java
/*
* 鸭子实现了Duck的接口,具备呱呱叫和飞行的能力
*/
public interface Duck
{
public void quack();
public void fly();
}
定义一个火鸡的模型接口:
Turkey.java
/*
* 介绍新的街头冠禽
*/
public interface Turkey
{
void gobble();//火鸡不会呱呱叫,只会咯咯gobble叫
void fly();//火鸡会飞,但是非不远
}
绿头鸭Mallard的实现
MallardDuck.java
/*
* 绿头鸭Mallard是鸭子的子类,这里可以实现quack和fly
*/
public class MallardDuck implements Duck
{
public void quack()
{
System.out.println("quack!quack!");
}
public void fly()
{
System.out.println("I can fly");
}
}
一个火鸡的实现
WildTurkey.java
/*
* 一个火鸡的具体实例
*
* 现在,假设你却鸭子对象,想用一些火鸡来冒充鸭子的对象
* 显而易见,因为火鸡的接口不同,所以我们不能公然拿来冒充
*/
public class WildTurkey implements Turkey
{
public void gobble()
{
System.out.println("gobble!gobble!");
}
public void fly()
{
System.out.println("I'm flying a short distance!");
}
}
定义一个适配器类
TurkeyAdapter.java
/*
*首先,这里需要实现要转换的类型接口,
* 也就是客户所期待看到的接口
*
*/
public class TurkeyAdapter implements Duck
{
Turkey turkey;
/*
* 接着,这里需要取得适配的引用对象,这里利用构造器取得这个引用。
*/
public TurkeyAdapter(Turkey turkey)
{
this.turkey = turkey;
}
/*
* 现在需要实现接口里的所有方法,
* quack()实现方式很简单,只需要调用gobble()方法即可
*/
public void quack()
{
this.turkey.gobble();
}
@Override
/*
* 虽然两个接口都有fly()方法,但是火鸡的飞行距离很短,不像鸭子可以长途飞行,
* 要让鸭子与火鸡的飞行能够对应,必须连续5次调用火鸡的fly()方法来完成
*/
public void fly()
{
int i;
for (i = 0; i < 5; i++) {
this.turkey.fly();
}
}
}
测试适配器功能:
DuckTestDrive.java
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("The Turkey says: ");
testTurkey(turkey);
System.out.println("");
System.out.println("The Duck says: ");
testDuck(duck);
System.out.println("");
System.out.println("The TurkeyAdapter says: ");
testDuck(turkeyAdapter);
}
public static void testTurkey(Turkey turkey) {
turkey.fly();
turkey.gobble();
}
public static void testDuck(Duck duck) {
duck.fly();
duck.quack();
}
}