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

一、问题描述


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

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



二、类图


适配器模式(Adapter Pattern)(二):HeadFirst中的火鸡冒充鸭子_第1张图片



三、代码实现


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

你可能感兴趣的:(java,设计模式,Adapter,Headfirst)