设计模式之七:适配器模式(火鸡转换成鸭子)

适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

适配器分为: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();
    }

}
posted @ 2012-10-04 19:14  黄辉杰  阅读(746)  评论(0编辑  收藏  举报