繁体   English   中英

行数据网关的注册表模式

[英]Registry pattern with Row Data Gateway

我正在阅读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);
    }
}

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

在这种情况下,注册表的作用就像一个缓存(或者您很快就会看到或可能已经拥有的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注册它,以便整个应用程序都可以访问它(这可能会引起更多的问题,而不是解决的问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM