MST

星途 面试题库

面试题:Java适配器模式实现多数据源适配的关键代码结构

假设要使用Java适配器模式适配关系型数据库(如MySQL)和非关系型数据库(如MongoDB)数据源。请描述实现此功能的关键类结构、接口设计以及它们之间的交互逻辑,并给出核心代码示例。
34.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

关键类结构

  1. 数据库接口(Database Interface):定义通用的数据库操作方法,如连接、查询、插入等。
  2. 关系型数据库实现类(Relational Database Implementor):实现数据库接口,针对关系型数据库(如MySQL)进行具体操作的实现。
  3. 非关系型数据库实现类(Non - Relational Database Implementor):实现数据库接口,针对非关系型数据库(如MongoDB)进行具体操作的实现。
  4. 适配器类(Adapter):持有一个非关系型数据库实现类的实例,实现数据库接口,将非关系型数据库的操作适配成关系型数据库接口所定义的操作。

接口设计

// 数据库接口
interface Database {
    void connect();
    void query(String sql);
    void insert(String data);
}

关系型数据库实现类

class MySQLDatabase implements Database {
    @Override
    public void connect() {
        System.out.println("Connecting to MySQL database");
    }

    @Override
    public void query(String sql) {
        System.out.println("Querying MySQL database with SQL: " + sql);
    }

    @Override
    public void insert(String data) {
        System.out.println("Inserting data into MySQL database: " + data);
    }
}

非关系型数据库实现类

class MongoDB {
    public void mongoConnect() {
        System.out.println("Connecting to MongoDB");
    }

    public void mongoFind(String query) {
        System.out.println("Finding in MongoDB with query: " + query);
    }

    public void mongoInsert(String document) {
        System.out.println("Inserting document into MongoDB: " + document);
    }
}

适配器类

class MongoAdapter implements Database {
    private MongoDB mongoDB;

    public MongoAdapter(MongoDB mongoDB) {
        this.mongoDB = mongoDB;
    }

    @Override
    public void connect() {
        mongoDB.mongoConnect();
    }

    @Override
    public void query(String sql) {
        // 这里简单将SQL转成MongoDB查询,实际更复杂
        mongoDB.mongoFind(sql);
    }

    @Override
    public void insert(String data) {
        mongoDB.mongoInsert(data);
    }
}

交互逻辑

  1. 创建关系型数据库实现类(如MySQLDatabase)的实例,可以直接调用数据库接口定义的方法进行操作。
  2. 创建非关系型数据库实现类(如MongoDB)的实例,由于它不符合数据库接口,不能直接使用。
  3. 创建适配器类(如MongoAdapter)的实例,并将非关系型数据库实现类的实例传入适配器构造函数。
  4. 通过适配器实例调用数据库接口的方法,适配器会将调用转发到非关系型数据库实现类的相应方法上,完成适配操作。

核心代码示例(测试代码)

public class AdapterPatternExample {
    public static void main(String[] args) {
        // 使用关系型数据库
        Database mySQL = new MySQLDatabase();
        mySQL.connect();
        mySQL.query("SELECT * FROM users");
        mySQL.insert("('John', 'Doe')");

        // 使用非关系型数据库通过适配器
        MongoDB mongo = new MongoDB();
        Database mongoAdapter = new MongoAdapter(mongo);
        mongoAdapter.connect();
        mongoAdapter.query("{name: 'John'}");
        mongoAdapter.insert("{name: 'Jane', age: 30}");
    }
}