用于通过传递引擎对象

时间:2015-10-07 13:48:26

标签: database design-patterns

我有一个名为DatabaseModel的课程。

一个名为DatabaseEngineInterface的接口,它具有以下方法: 插入 更新 删除 选择

所以我可以在运行时确定使用哪个引擎mysqloracle这些类是实现DatabaseEngineInterface

的类
EngineDatabase engine = new MySQLEngine();
DatabaseModel db = new DatabaseModel(engine);

这种设计模式叫做什么?

3 个答案:

答案 0 :(得分:3)

具体来说,这是构造函数注入模式(在my book中描述),这是Strategy pattern的一个特例。

答案 1 :(得分:0)

它不是strategy pattern的实现吗?维基百科指出战略模式是:

>a software design pattern that enables an algorithm's behavior to be selected at runtime

它还说战略模式:

  • 定义了一系列算法,
  • 封装每个算法,
  • 使算法在该系列中可互换。

您允许在运行时选择将使用的数据库(以及行为)。您已经定义了一系列算法(您的接口),封装了每个算法(通过为每个提供程序创建一个类),并且它们可以互换使用,因为DatabaseMode l仅取决于接口。

答案 2 :(得分:0)

DaoFactory设计模式非常适合您的实施。

接口

public interface DatabaseEngineInterface {
    public void insert(User user);
    public void update(User user);
    public void delete(int userId);
}

实现上述方法的类:

public class DatabaseModel implements DatabaseEngineInterface {
    @Override
    public void delete(int userId) {
        // delete user from user table
    }

    @Override
    public User[] findAll() {
        // get a list of all users from user table
        return null;
    }

    @Override
    public User findByKey(int userId) {
        // get a user information if we supply unique userid
        return null;
    }

    @Override
    public void insert(User user) {
        // insert user into user table
    }

    @Override
    public void update(User user) {
        // update user information in user table
    }
}

public class DatabaseModelDAOFactory {
        public static UserDAO getUserDAO(String type) { 
        if (type.equalsIgnoreCase("mysql")) {
            return new UserDAOMySQLImpl();
        } else {
            return new UserDAOORACLEImpl();
        }
    }
}

客户端代码:

然后,在客户端而不是硬编码的行,如:

DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDAODatabaseEngineInterface("jdbc");

你可以让一个属性文件动态地在DAO之间切换,从你可以简单地执行的属性文件中检索到该字符串:

DatabaseModel userDAO=DatabaseModelDAOFactory.getUserDaoDatabaseEngineInterface(myStringFromPropertiesFile);

myStringFromPropertiesFile将包含" mysql"或者" oracle"根据属性文件中的定义。