[英]How to design the interface / abstract class here (OOP design)
我有一个抽象类,有些类扩展了抽象类。 现在我想在子类中存在的每个函数之前进行一些预处理( 例如,这些函数不过是从数据库中获取实体而已,因此,即使在使用DB之前,也要检查缓存中的实体是否存在于缓存中,然后返回else调用call()
或call(final Set<String> args)
的实体将其存储在缓存中并返回 。 所以我介绍了一个接口,例如
interface PQRCallable <K> {
K call();
Set<K> call(final Set<String> args);
}
在call
函数中,子类函数编写逻辑以从DB中获取实体。 现在,子类中的每个函数都调用抽象类中存在的两个常用函数之一,即doProcessing(String k, ..., PQRCallable pQRCallable)
doProcessing(Set<k>, ..., PQRCallable pQRCallable)
和PQRCallable
以便如果预处理将遇到任何问题,它将退回到call()
或call(final Set<String> args)
。
我的问题是,现在子类中的每个函数都需要实现这两个函数。 并且doProcessing(Set<k>, ..., PQRCallable pQRCallable)
将始终调用Set<K> call(final Set<String> args);
和doProcessing(String k, ..., PQRCallable pQRCallable)
将始终调用K call();
。 因此,实际上,子类将仅实现一个功能,而对于其他功能,它们仅应引发一些异常,如UnsupportedOperationException
。
有人可以建议我为此采取更好的方法吗? 谢谢。
也许图案装饰器可以帮助您解决这个问题。
抱歉,链接在C#中,但是有一个不错的UML模式!
包装doProcessing方法:
doProcessing(String k, ...){
this.pQRCallable.call();
//Your processing logic
//It could be useful to catch the UnsupportedOperationException
}
doProcessing(Set<K> k, ...){
this.pQRCallable.call(args);//you didn't specify how you are getting the args
//Your processing logic
}
您可以看到pQRCallable
现在是抽象类中的一个字段,并且可以在运行时通过实用程序类或使用具体子类的构造函数对其进行设置。
子类将不必实现您的接口,并且在运行时,您将确保设置正确的PQRCallable(实现所需调用的那个)
您可以使用动态代理包装数据库方法。 在调用处理程序中,您可以检查请求的对象是否已经在缓存中。 仅当它们不在您的缓存中时,您才能将调用转发到实际的数据库访问对象。
例如代码签出: http : //tutorials.jenkov.com/java-reflection/dynamic-proxies.html
考虑使用带有缓存的成熟数据访问框架,例如Hibernate二级缓存 。
失败的话,您的情况最适合GoF模板方法模式。 请特别注意DataAccessObject的真实示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.