- 定义
适配器模式将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
- 案例分析
假设现在缺一个鸭子对象,想用火鸡对象来冒充。则必须将Turkey对象包装成Duck对象,代码如下:
Duck接口
package sxd.learn.dp;
public interface Duck {
public void quack();
public void fly();
}
Turkey接口:
package sxd.learn.dp;
public interface Turkey {
public void gobble();
public void fly();
}
绿头鸭MallardDuck 类:
package sxd.learn.dp;
public class MallardDuck implements Duck{
@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'm flying");
}
}
野火鸡WildTurkey类:
package sxd.learn.dp;
public class WildTurkey implements Turkey{
@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'm flying a short distance");
}
}
适配器TurkeyAdapter类,它完成在没有Duck对象的情况下模仿Duck的动作(使用Turkey对象模仿Duck)。
package sxd.learn.dp;
public class TurkeyAdapter implements Duck{
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
super();
this.turkey = turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
for(int i = 0; i < 5; i++)
turkey.fly();
}
}
测试类:
package sxd.learn.dp;
public class DuckTestDrive {
public static void main(String[] args) {
// TODO Auto-generated method stub
MallardDuck mallardDuck = new MallardDuck();
WildTurkey wildTurkey = new WildTurkey();
Duck turkeyAdapterDuck = new TurkeyAdapter(wildTurkey);
System.out.println("The Duck says ...");
mallardDuck.quack();
mallardDuck.fly();
System.out.println("\nThe Turkey says ...");
wildTurkey.gobble();
wildTurkey.fly();
System.out.println("\nThe TurkeyAdapter says ...");
turkeyAdapterDuck.quack();
turkeyAdapterDuck.fly();
}
}
输出结果: