1

我正在阅读 Martin Fowlers 的书,即企业应用程序模式:ftp: //ftp.heanet.ie/mirrors/sourceforge/w/we/webtune/Patterns%20of%20Enterprise%20Application%20Architecture.pdf。我遇到了行数据网关模式,特别是注册表模式。这是本书第 149 页的代码片段:

public static Person find(Long id) {
    Person result = (Person) Registry.getPerson(id);
    if (result != null) 
        return result;
    PreparedStatement findStatement = null;
    ResultSet rs = null;
    try {
        findStatement = DB.prepare(findStatementString);
        findStatement.setLong(1, id.longValue());
        rs = findStatement.executeQuery();
        rs.next();
        result = load(rs);
        return result;
    } catch (SQLException e) {
        throw new ApplicationException(e);
    } finally {
         DB.cleanUp(findStatement, rs);
    }
}

上面的代码调用了注册表类,但我不确定注册表类有什么好处。我已经阅读了关于注册表类的章节,但我仍然不清楚。我知道它们是静态方法。

4

1 回答 1

1

在这种情况下,注册表就像一个缓存(或者IdentityMap您很快就会看到或可能已经拥有的缓存),如果您的应用程序已经拥有对该Person对象的引用,它将不会从数据库中获取它。

从书中

当你想找到一个对象时,你通常从另一个与之有关联的对象开始,并使用该关联来导航到它。因此,如果您想查找客户的所有订单,您可以从客户对象开始,并在其上使用方法来获取订单。但是,在某些情况下,您将没有合适的对象开始。

Registry模式基本上是对象引用的持有者,因此您不必遍历复杂的对象依赖关系来获取链中的最后一个对象。示例(您在实践中永远不会看到):

class Book {
    public Author author;
}

class Author {
    public City city;
}

class City {
    public String name;
}

您不希望必须经过Book -> Author才能获得City对象。

Registry通常使用来保持对全局对象的引用,这就是 Fowler 建议使用static方法的原因,但正如您可以继续阅读的那样page 409,您应该很少使用这种模式"as a last resort"

设计不佳的注册表示例

class CityRegistry {
    private static Map<String, City> references = new HashMap<>();
    public static void registerCity(String id, City reference) {
        references.put(id, reference);
    }

    public static City getCity(String id) {
        return references.get(id);
    }
}

每当您创建某个类的实例时,您都会在其中注册它,Registry以便整个应用程序都可以访问它(这可能会导致比它解决的问题更多的问题)。

于 2013-04-17T18:53:37.767 回答