zoukankan      html  css  js  c++  java
  • 设计模式:适配器模式

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

      在生活中,一个二插转换器就是一个适配器,本来不能将二插的插头插入三插插口,利用了这个转换器就可以实现,这个二插转换器在中间起到了一端连接插座,一端连接插头的作用。

      场景:之前我们看过鸭子Duck类,现在我们有个火鸡,让我们通过适配器把它伪装成鸭子。

      首先创建鸭子和火鸡接口

    //鸭子接口
    public interface Duck {
        //简单点,直接让鸭子具有呱呱叫和飞行能力
        public void quack();
        public void fly();
    }
    
    //火鸡接口
    public interface Turkey {
        //火鸡不会呱呱叫,只会咯咯叫
        public void gobble();
        //火鸡也能飞,但飞不远
        public void fly();
    }

      接着实现具体的鸭子和火鸡

    //实现Duck接口的具体类,绿头鸭
    public class MallardDuck implements Duck{
    
        @Override
        public void quack() {
            System.out.println("Quack");
        }
    
        @Override
        public void fly() {
            System.out.println("I'm fly");
        }
    }
    
    //实现火鸡接口的具体类
    public class WildTurkey implements Turkey {
    
        @Override
        public void gobble() {
            System.out.println("Gobble gobble");
        }
    
        @Override
        public void fly() {
            System.out.println("I'm flying a short distance");
        }
    }

      实现一个火鸡和鸭子连接的适配器

    //实现向转换成的类型接口,也就是客户所希望看到的接口
    public class TurkeyAdapter implements Duck{
    
        Turkey turkey;
        
        //需要取得要适配的对象引用,这里为了方便直接用构造器来取得这个引用
        public TurkeyAdapter(Turkey turkey){
            this.turkey = turkey;
        }
        
        @Override
        public void quack() {
            //把火鸡的咯咯叫伪装成鸭子的quack叫声
            turkey.gobble();
        }
    
        @Override
        public void fly() {
            //因为火鸡飞不远,为了将火鸡的飞行伪装成鸭子的飞行,让火鸡多飞几次
            for(int i=0; i<5; i++){
                turkey.fly();
            }
        }
    }

      最后编写测试类

    public class Test {
        public static void main(String[] args) {
            //创建一直鸭子和火鸡
            MallardDuck duck = new MallardDuck();
            WildTurkey turkey = new WildTurkey();
            
            //将火鸡保证金一个火鸡适配配,伪装成鸭子
            Duck turkeyAdapter = new TurkeyAdapter(turkey);
            
            System.out.println("----Test Turkey----");
            //测试真正火鸡的行为
            turkey.gobble();
            turkey.fly();
            
            //测试鸭子的行为,包括伪装成鸭子的火鸡
            System.out.println("----Test Duck----");
            testDuck(turkeyAdapter);
            testDuck(duck);
        }
        
        public static void testDuck(Duck duck){
            duck.quack();
            duck.fly();
        }
    }

      运行结果如下:

      下面总结下客户使用适配器的过程。

        1:客户(鸭子)通过目标接口调用适配器的方法对适配器发出请求。

        2:适配器使用被适配者接口(火鸡接口)把请求转换成被适配者的一个或多个调用接口(具体的火鸡接口实现类)。

        3:客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。

      好了,这就是简单的适配器例子了。

      下一节:外观模式

    作者:哀&RT
    出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6513960.html
Copyright © 2011-2022 走看看