Luk*_*der 2 java design-patterns interface
在我的项目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);
}
Run Code Online (Sandbox Code Playgroud)
此接口的方法由库的所有包在内部使用,以构造和执行SQL.不应直接从客户端代码调用它们.为此,我补充说
public interface QueryPartProvider {
QueryPart getQueryPart();
}
Run Code Online (Sandbox Code Playgroud)
这是唯一公开的界面.实际查询部分的示例是:
public interface Table extends QueryPartProvider {}
class TableImpl implements QueryPart, Table {}
Run Code Online (Sandbox Code Playgroud)
如您所见,QueryPart方法只能通过Table.getQueryPart().toSQLDeclaration()
等方式访问.
我的设计有助于阻止对QueryPart方法的直接访问,但不能完全隐藏它.我的问题是:谁能告诉我一个好的设计模式来实现这个目标?
注意:最简单但不是很好的解决方案是将所有对象强制转换为QueryPart,例如 ((QueryPart) table).toSQLDeclaration()
界面的所有方法都是公共的,因此您无法访问库客户端无法访问的内容.也许你可以使用抽象类来实现你想要的东西Table
,并将getQueryPart()
方法作为包保护.我不知道但是我会想这样做,而不是从铸造Table
到TableImpl
.
归档时间: |
|
查看次数: |
4233 次 |
最近记录: |