• java设计模式之适配器模式


    适配器模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。

    对于这个模式,有一个经常被拿来解释它的例子,就是 USB 转接头充当适配器,把两种不兼容的接口,通过转接变得可以一起工作。

    适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

    假如我们这里有一个旧的Api,可能是之前的团队开发的,现在的客户端需要的是基于Target的接口

    旧Api

    /**
     * 旧的不兼容的接口
     */
    public class Api {
        void fa() {
            System.out.println("I am Api.fa()");
        }
    }

    需要的基于Target的接口

    /**
     * 目标要求的接口
     */
    public interface Target {
        void f1();
    }

    旧API和新的客户端需求是不兼容的,这个时候我们就需要通过一个适配器来适配。

    首先我们基于继承的方式来实现适配器

    /**
     * 基于继承的适配器
     */
    public class ApiAdapter extends Api implements Target{
        @Override
        public void f1() {
            System.out.println("I am ApiAdapter.f1()");
            fa();
        }
    }
    
    /**
     * 基于组合的适配器
     */
    public class ApiAdapter2 implements Target{
        private Api api;
    
        public ApiAdapter2(Api api) {
            this.api = api;
        }
    
        @Override
        public void f1() {
            System.out.println("I am ApiAdapter2.f1()");
            api.fa();
        }
    }

    客户端调用

    public class Client {
        public static void main(String[] args) {
            ApiAdapter apiAdapter = new ApiAdapter();
            apiAdapter.f1();
    
            ApiAdapter2 apiAdapter2 = new ApiAdapter2(new Api());
            apiAdapter2.f1();
        }
    }

    输出

    I am ApiAdapter.f1()
    I am Api.fa()
    I am ApiAdapter2.f1()
    I am Api.fa()
  • 相关阅读:
    C++中的extern "C"【转】
    无题
    MATLAB中文件的读写和数据的导入导出【转】
    逝去的2012
    C/C++语言中Static的作用详述
    C++:源文件与头文件有什么区别【转】
    Bash,后台与nohup
    关于include 和 extern
    python易错点
    android实现点击两次返回键实现退出功能
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15859286.html
Copyright © 2020-2023  润新知