关键类结构
- 数据库接口(Database Interface):定义通用的数据库操作方法,如连接、查询、插入等。
- 关系型数据库实现类(Relational Database Implementor):实现数据库接口,针对关系型数据库(如MySQL)进行具体操作的实现。
- 非关系型数据库实现类(Non - Relational Database Implementor):实现数据库接口,针对非关系型数据库(如MongoDB)进行具体操作的实现。
- 适配器类(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);
}
}
交互逻辑
- 创建关系型数据库实现类(如
MySQLDatabase
)的实例,可以直接调用数据库接口定义的方法进行操作。
- 创建非关系型数据库实现类(如
MongoDB
)的实例,由于它不符合数据库接口,不能直接使用。
- 创建适配器类(如
MongoAdapter
)的实例,并将非关系型数据库实现类的实例传入适配器构造函数。
- 通过适配器实例调用数据库接口的方法,适配器会将调用转发到非关系型数据库实现类的相应方法上,完成适配操作。
核心代码示例(测试代码)
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}");
}
}