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


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

    适配器分为: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();
        }
    
    }
  • 相关阅读:
    图->存储结构->十字链表
    图->存储结构->邻接表
    P2278-[HNOI2003]操作系统
    P1801-黑匣子_NOI导刊2010提高(06)
    P1197-[JSOI2008]星球大战
    P2024- [NOI2001]食物链
    P1111-修复公路
    ACM模板——二分图匹配
    P2055-[ZJOI2009]假期的宿舍
    ACM模板——强连通分量
  • 原文地址:https://www.cnblogs.com/damonhuang/p/2711643.html
Copyright © 2020-2023  润新知