【发布时间】:2010-12-03 08:31:07
【问题描述】:
在我的项目jOOQ 中,我使用复杂的数据结构对 SQL 查询进行建模。查询的所有组件都实现了
public interface QueryPart {
int bind(java.sql.PreparedStatement stmt);
int bind(java.sql.PreparedStatement stmt, int initialIndex);
SQLDialect getDialect();
String toSQLDeclaration();
String toSQLDeclaration(boolean inlineParameters);
String toSQLReference();
String toSQLReference(boolean inlineParameters);
}
该接口的方法被库的所有包在内部用于构造和执行 SQL。不应直接从客户端代码调用它们。为此,我添加了
public interface QueryPartProvider {
QueryPart getQueryPart();
}
这是唯一公开的接口。实际查询部分的示例是:
public interface Table extends QueryPartProvider {}
class TableImpl implements QueryPart, Table {}
如您所见,QueryPart 方法只能通过Table.getQueryPart().toSQLDeclaration() 等方式访问。
我的设计有助于阻止直接访问 QueryPart 方法,但不能完全隐藏它。我的问题是:谁能告诉我一个好的设计模式来实现这个目标?
注意:最简单但不是很好的解决方案是将所有对象转换为 QueryPart,例如((QueryPart) table).toSQLDeclaration()
【问题讨论】:
-
如果你想隐藏它,为什么要添加一个'getQueryPart'方法?
-
您可以尝试隐藏实现此接口的对象。这是你需要的吗?
-
@Arne:我想从客户端代码中隐藏它,但将它暴露给库。 @Stas:实现接口的对象是包私有的(参见 TableImpl)。这些对象通过接口公开(见表)
标签: java design-patterns interface