• 设计模式:适配器模式


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

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

      场景:之前我们看过鸭子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/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    GZOI 2017配对统计 树状数组
    关于线段树的一些问题
    BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
    洛谷4552 差分
    洛谷5026 Lycanthropy 差分套差分
    【锁】MySQL和Oracle行锁比较
    oracle体系结构
    【加密】RSA验签及加密
    【Shiro】SpringBoot集成Shiro
    【Eureka】实现原理
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6513960.html
Copyright © 2020-2023  润新知