设计模式之七:适配器模式(火鸡转换成鸭子)
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器分为:1)"对象"适配器;下面例子就是对象适配器。
2)"类"适配器。
两者区别:对象适配器采用的是组合方法;
类适配器采用的是继承方法。
适配者与装饰者区别:适配器将一个对象包装起来以改变其接口;
装饰者将一个对象包装起来以增加新的行为和责任。
工程名称:TurkeyAdapter 下载目录:http://www.cnblogs.com/jrsmith/admin/Files.aspx , TurkeyAdapter.zip
1 package com.jyu.duck; 2 3 /** 4 * 鸭子接口 5 * @author JRSmith 6 * 7 */ 8 public interface Duck { 9 10 public void quack(); 11 public void fly(); 12 }
1 package com.jyu.duck; 2 3 /** 4 * 绿头鸭 5 */ 6 public class MallardDuck implements Duck { 7 8 @Override 9 public void quack() { 10 System.out.println("Quack..."); 11 } 12 13 @Override 14 public void fly() { 15 System.out.println("Fly..."); 16 } 17 18 }
1 package com.jyu.turkey; 2 3 /** 4 * 火鸡接口 5 * @author JRSmith 6 * 7 */ 8 public interface Turkey { 9 10 public void gobble(); 11 public void fly(); 12 }
package com.jyu.turkey; /** * 火鸡 * @author JRSmith * */ public class WildTurkey implements Turkey { @Override public void gobble() { System.out.println("Gobble..."); } @Override public void fly() { System.out.println("I'm flying a short distance..."); } }
1 package com.jyu.adapter; 2 3 import com.jyu.duck.Duck; 4 import com.jyu.turkey.Turkey; 5 6 /** 7 * 将火鸡转换成鸭子 8 * @author JRSmith 9 * 10 */ 11 public class TurkeyAdapter implements Duck {//首先,你需要实现想转换成的类型接口,也就是你的客户所期望看到的接口。 12 13 Turkey turkey;//被适配者 14 15 public TurkeyAdapter(Turkey turkey) {//接着,需要取得要适配的对象引用,这里我们利用构造器取得这个引用。 16 this.turkey = turkey; 17 } 18 19 @Override 20 public void quack() { 21 turkey.gobble();//现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,只要调用gobble()就可以了。 22 } 23 24 @Override 25 public void fly() { 26 for(int i=5; i>0; i--){ 27 turkey.fly(); 28 } 29 } 30 31 }
package com.jyu.test; import com.jyu.adapter.TurkeyAdapter; import com.jyu.duck.Duck; import com.jyu.duck.MallardDuck; import com.jyu.turkey.WildTurkey; public class DuckTestDrive { /** * @param args */ public static void main(String[] args) { MallardDuck mallarDuck = new MallardDuck();//先创建一个鸭子 WildTurkey wildTurkey = new WildTurkey();//创建一个火鸡 Duck turkeyAdapter = new TurkeyAdapter(wildTurkey);//然后将火鸡包装进一个火鸡适配器中,使它看起来像一只鸭子。 System.out.println("The Turkey says...");//测试这只火鸡 wildTurkey.gobble(); wildTurkey.fly(); System.out.println("\n The Duck says...");//调用testDuck()方法来测试鸭子,这个方法需要传入一个鸭子对象 testDuck(mallarDuck); System.out.println("\n The TurkeyAdapter says...");//我们试着传入一个假装是鸭子的火鸡 testDuck(turkeyAdapter); } public static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }