适配器模式(Adapter Pattern)(二):HeadFirst中的火鸡冒充鸭子

来源:互联网 发布:python实现svm smo 编辑:程序博客网 时间:2024/04/30 04:40

一、问题描述


火鸡通过模仿鸭子走路的姿势、叫的声音以及飞行就可以将自己伪装成一只鸭子,当我们缺少鸭子对象时,就可以使用一些火鸡对象来冒充鸭子对象,但是我们还必须编写一个接口,使一只火鸡可以通过这个接口(即适配器)装换成一只鸭子。

我们可以写一个对象适配器或类适配器将火鸡适配成鸭子。



二、类图





三、代码实现


1.Duck,鸭子的父接口

public interface Duck {public void quack();public void fly();}

2.Turkey,火鸡的父接口

public interface Turkey {public void gobble();public void fly();}

3.具体鸭子MallardDuck

public class MallardDuck implements Duck {public void quack() {System.out.println("Quack");} public void fly() {System.out.println("I'm flying");}}

4.具体火鸡WildTurkey

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");}}

5.火鸡适配器TurkeyAdapter(对象适配器)

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();}}}

6.测试

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

原创粉丝点击