适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器分为:1)"对象"适配器;下面例子就是对象适配器。
2)"类"适配器。
两者区别:对象适配器采用的是组合方法;
类适配器采用的是继承方法。
适配者与装饰者区别:适配器将一个对象包装起来以改变其接口;
装饰者将一个对象包装起来以增加新的行为和责任。
工程名称:TurkeyAdapter 下载目录: , 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 @Override14 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 @Override20 public void quack() {21 turkey.gobble();//现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单,只要调用gobble()就可以了。22 }23 24 @Override25 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(); }}