• 服务提供者框架讲解 之 myJDBC


    利用一个简单的myJDBC,讲一下‘服务提供者框架’的思想.主要是思想
    

    目录


    什么是 服务提供者框架

    服务提供者框架 有四个部分组成,这是老生常谈的话题了;

    1. 服务接口
    2. 服务提供者接口
    3. 服务注册 API
    4. 服务访问 API

    大家都知道 JDBC 就是一个 服务提供者框架


    代码讲解

    还是用代码好讲解
    

    服务接口

    /**
     * 服务接口: 表示我们的框架提供什么服务,但是我们框架并不会去实现这个服务,交由服务提供者实现
     *
     * 这里提供操作数据库的服务
     */
    interface OpeDatebase {
        void crud();
    }

    服务提供者接口

    /**
     * 服务提供者接口:主要规定 服务提供者都必须实现这个接口,
     * 在注册的时候,统一用这个接口的名字去注册,便于框架管理这些服务提供者;
     * <p>
     * (这个接口是可选项,假如没有对外提供这个接口,则可以通过泛型、反射来完成注册的操作,但是反射的效率低下)
     */
    interface Provide {
        OpeDatebase getOpeDatebase();
    }

    服务注册API、服务访问API

    下面的是框架的主体代码,负责管理整个框架,它提供 服务注册 API服务访问 API

    /**
     * 服务提供者框架的主体
     * <p>
     * JDBC 就是 一个服务提供者框架
     */
    public class myJdbc {
    
        private static Map<String, Provide> map = new HashMap<>();
    
        /**
         * 服务注册接口
         * <p>
         * 为 服务提供者 提供注册API
         *
         * @param name    服务提供者的名字
         * @param provide  服务提供者的实现类
         */
        public static void registerProvider(String name, Provide provide) {
    //        将服务提供者 注册到 框架里面
            map.put(name, provide);
    
        }
    
        /**
         * 服务提供 API
         *
         * @param name 服务的名字
         * @return
         */
        public static Provide getProvide(String name) {
            return map.get(name);
        }
    
    }

    静态工厂方法

    写到这,就必须说下,静态工厂方法的优点之一(可以点击)就是可以灵活的返回原对象类型的子类型

    服务者提供框架,也是 静态工厂方法 的一个体现;我们也发现了,我们的 myJDBC 已经写好了,但是服务的实现类,现在并没有写;这也是 静态工厂方法 的迷人之处 ;


    服务实现类 – sql、oracle

    sql

    
    /**
     * 服务具体的实现类  --- sql
     */
    class sql implements OpeDatebase {
    
        @Override
        public void crud() {
            System.out.println("SQL 操作数据库");
        }
    }
    ---------------------------------------------------------------
    /**
     * 服务具体的实现者的注册类  --- sql
     */
    class sqlRegister implements Provide {
    
    //  私有化构造器,使得只能 通过 加载类来进行注册
        private sqlRegister(){}
    
        static {
    //        类加载的时候,就将它们注册到 myJdbc
            myJdbc.registerProvider("sqlRegister", new sqlRegister());
        }
    
        @Override
        public OpeDatebase getOpeDatebase() {
            return new sql();
        }
    }
    

    oracle

    /**
     * 服务具体的实现类 --- oracle
     */
    class oracle implements OpeDatebase {
    
        @Override
        public void crud() {
            System.out.println("oracle 操作数据库");
        }
    }
    ----------------------------------------------
    /**
     * 服务具体的实现者的注册类  --- oracle
     */
    class oracleRegister implements Provide {
    
    
        private oracleRegister(){}
    
        static {
    //        将它们注册到 myJdbc
            myJdbc.registerProvider("oracleRegister", new oracleRegister());
        }
    
        @Override
        public OpeDatebase getOpeDatebase() {
            return new oracle();
        }
    }

    测试一下 myJDBC

    这里,我们只要更换 Class.forName("mooc.oracleRegister");,就会完成不同的注册 ;我们,完全可以写一个配置文件,来读取配置文件,加载不同的实现,这样就完全解耦了;

    class test{
        @Test
        public  void test() throws ClassNotFoundException {
    //        加载类,即完成注册,因为类的源码里面这样做了,其实JDBC的服务提供者也是这样做的
            Class.forName("mooc.oracleRegister");
    //        我们获取我们注册的实例
            Provide provide = myJdbc.getProvide("oracleRegister") ;
            OpeDatebase opeDatebase = provide.getOpeDatebase();
            opeDatebase.crud();
    
        }
    }

    输出:oracle 操作数据库

  • 相关阅读:
    webDriver检索table数据
    C# 遍历枚举
    Java——Iterate through a HashMap
    Java——Read/convert an InputStream to a String
    简单的异步HTTP服务端和客户端
    授信主体查找
    mysql 事务测试
    mysql 替换
    如何查看由EF生成的SQL?
    C# 如何用多字符分割字符串
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665723.html
Copyright © 2020-2023  润新知