火鸡通过模仿鸭子走路的姿势、叫的声音以及飞行就可以将自己伪装成一只鸭子,当我们缺少鸭子对象时,就可以使用一些火鸡对象来冒充鸭子对象,但是我们还必须编写一个接口,使一只火鸡可以通过这个接口(即适配器)装换成一只鸭子。
我们可以写一个对象适配器或类适配器将火鸡适配成鸭子。
1.Duck,鸭子的父接口
public interface Duck { public void quack(); public void fly(); }
public interface Turkey { public void gobble(); public void fly(); }
public class MallardDuck implements Duck { public void quack() { System.out.println("Quack"); } public void fly() { System.out.println("I'm flying"); } }
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"); } }
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("The Turkey says..."); turkey.gobble(); turkey.fly(); System.out.println("\nThe Duck says..."); testDuck(duck); System.out.println("\nThe TurkeyAdapter says..."); testDuck(turkeyAdapter); } static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
说明:
同样,我们也可以写一个鸭子适配器让鸭子类冒充火鸡。但是,当我们想写一个双向适配器以便鸭子和火鸡可以双向适配时,就会遇到一个问题:我们所写的适配器类要实现Duck和Turkey接口,而这两个接口中声明了相同的方法fly(),这时在适配器类中只有一个fly()方法,就无法适配两者的飞行行为。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8886567