- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用接口(interface)、抽象类和泛型在 Java 中创建一个相当复杂的结构。由于没有使用泛型的经验,在创建良好的 OOP 设计方面只有一般经验,这开始证明是一个相当大的挑战。
我有种感觉,我想做的事情实际上无法完成,但我可以接近它。我会尽量简短地解释一下。我只想直接告诉你,这个结构将代表我的 DAO 和服务层来访问数据库。让这个问题更抽象只会让它变得更难。
我的 DAO 层完全没问题。有一个通用 DAO 接口(interface),对于每个实体,都有一个扩展通用接口(interface)并填充通用类型的 DAO 接口(interface)。然后有一个由每个 DAO 实现扩展的抽象类,后者又实现相应的接口(interface)。很可能读起来很困惑,所以这里以产品的 DAO 为例:
现在对于服务类,我有一个类似的结构。无论如何,服务类中的大多数方法都映射到 DAO 方法。 如果你用“服务”替换上图中的每个“DAO”,你就得到了我的服务层的基础。但是我想做一件事,基于我的以下想法:
Every service class for an entity will at least access one DAO object, namely the DAO of the entity that it is designed for.
这是...
如果我可以进行适当的 OO 设计以使每个服务类都为其各自实体的 DAO 对象拥有一个实例变量,在我看来,我的服务层将是完美的。 欢迎就此提出建议,以防我的设计不如看上去的那么好。
我是这样实现的:
public abstract class AbstractService<EntityDAO> {
EntityDAO entityDAO;
public AbstractService() {
entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor
}
abstract EntityDAO makeEntityDAO();
}
public class ProductServiceImpl extends AbstractService<ProductDAOImpl> {
public ProductServiceImpl() {
super();
}
@Override
ProductDAOImpl makeEntityDAO() {
return new ProductDAOImpl();
}
}
此设计的问题是我不喜欢的编译器警告:它在构造函数中有一个可覆盖的方法调用(请参阅评论)。现在它被设计为可重写的,事实上我强制执行它是为了确保每个服务类都有对相应 DAO 的引用。这是我能做的最好的事情吗?
我已尽最大努力包含您可能需要的所有内容,并且仅包含您对此问题所需的内容。我现在要说的是,欢迎评论,更广泛的回答,感谢您花时间阅读。
最佳答案
首先要注意一点:通常在按层组织的应用程序中,例如 Presentation/Service/DAO,您有以下规则:
这将提供更容易的测试、更好的代码封装以及对不同层的更清晰的定义(通过易于识别为公共(public) API 的接口(interface))
就是说,有一种非常通用的方法可以以最灵活的方式处理这种情况:dependency injection .和 Spring是依赖注入(inject)(以及许多其他事物)的行业标准实现
这个想法(简而言之)是您的服务将知道它需要一个 IEntityDAO,并且 某人 将在实际使用之前注入(inject)它和接口(interface)的实现服务。那个某人 称为 IOC 容器(Inversion of Control 容器)。可以是Spring , 它所做的通常由应用程序配置文件描述,并将在应用程序启动时完成。
重要说明: 这个概念非常出色和强大,但却非常简单愚蠢。您还可以在没有框架的情况下使用控制反转架构模式,其实现非常简单,其中包含一个大型静态方法“组装”您的应用程序部分。但在工业环境中,最好有一个允许注入(inject)其他东西的框架,如数据库连接、Web 服务 stub 客户端、JMS 队列等......
好处:
示例 java 代码:
public abstract class AbstractService<IEntityDAO> {
private IEntityDAO entityDAO; // you don't know the concrete implementation, maybe it's a mock for testing purpose
public AbstractService() {
}
protected EntityDAO getEntityDAO() { // only subclasses need this method
}
public void setEntityDAO(IEntityDAO dao) { // IOC container will call this method
this.entityDAO = dao;
}
}
在 spring 配置文件中,你会有这样的东西:
<bean id="ProductDAO" class="com.company.dao.ProductDAO" />
[...]
<bean id="ProductService" class="com.company.service.ProductService">
<property name="entityDAO" ref="ProductDAO"/>
</bean>
关于java - 需要有关 java 中复杂结构的建议(DAO 和服务层链接/耦合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239354/
Law of Demeter表示你应该只与你直接了解的对象交谈。也就是说,不要执行方法链接来与其他对象通信。当您这样做时,您正在与中间对象不恰本地建立不正确的链接coupling您的代码到其他代码。
我已经实现了一个 CodeService,它将从代码表中检索国家/地区列表。 在我的 ShippingService 中,我想检查订单是否运送到某个国家/地区。 在这种情况下,我应该使用 CodeSe
虽然这个论坛上有很多包含耦合和内聚示例的好示例,但我正在努力将其完全应用到我的代码中。我可以识别代码中可能需要更改的部分。是否有任何 Java 专家能够查看我的代码并向我解释哪些方面是好的和坏的。我根
我有一个创建新对象 Student 并将其添加到数组列表 studentRegister 的方法: public void addStudent(String name, String age) {
在高耦合环境中,更改一个模块会影响另一个模块。好的,但我看不出这怎么可能(除了更改方法签名或返回类型)? 好吧,如果我改变一个类,那么它只能在以下情况下破坏其他类中的代码: 如果我突然改变了一个方法的
问题描述: 我正在一个项目中,以采用现有的JavaScript脚本并对其进行修改以支持异步加载。如果您不了解异步或延迟加载脚本,但想了解更多信息read this。 main.js脚本要做的第一件事之
我正在编写一个模拟,需要一些关于设计的提示。基本思想是生成给定随机过程的数据,然后将其用于各种计算。例如对于 1 次迭代: 进程 1 -> 为源 1 生成数据:x1 进程 2 -> 为源 1 生成数据
给定两个字符串,S1 和 S2。给定的计分方案包括空位罚分、不匹配分数和匹配分数。 找到与 S2 最匹配的 S1。 我的想法是列出所有可能的S1,然后与S2一一匹配。使用暴力列出所有可能的 S1。然后
我尝试使用 ctypes.CDLL 类 (Linux) 在 Python 中加载 C 共享库 .so。这是 link告诉我我做了什么。正如我看到的文档,它说 CDLL 类假定函数返回 int 类型。我
目录 什么是耦合性 什么是程序间的耦合 如何解耦 工厂模式解耦 案例 原因就是: 解决思路:
我尝试使用 Matlab 函数 Pdepe ( https://www.mathworks.com/help/matlab/ref/pdepe.html ) 求解平流扩散 react 问题的一维耦合偏
如何处理高级 C++ 应用程序中的耦合? 我们可以使用(例如)Witty 编写的 web 应用程序的完成代码,并用它制作控制台应用程序吗? ...或者将其更改为使用 Qt 制作的带有 GUI 的桌面应
假设我们有类: class Post def save # implementation end def self.find(id) #implementation e
简介 我正在尝试使用接口(interface)、抽象类和泛型在 Java 中创建一个相当复杂的结构。由于没有使用泛型的经验,在创建良好的 OOP 设计方面只有一般经验,这开始证明是一个相当大的挑战。
考虑 Windows 资源管理器(或 regedit 或类似工具)。左侧是 TreeView ,右侧是 ListView 。在我所知道的所有情况下,右 View 的内容都反射(reflect)了左 P
我有一个耦合代码(fortran 和 c++),我现在在 python 中调用。 main.exe 工作正常,但是当我在 python 中调用耦合版本时,出现段错误(核心转储)错误。我确定了出现问题的
我正在尝试编写 CMakeLists.txt 以耦合一个简单的 FORTRAN 程序,该程序使用 iso_c_binding 调用 C++ 函数。当我使用 gfortran 作为 FORTRAN 编译
我们将 NHibernate 用于 ORM,在程序的初始化阶段,我们需要从数据库中加载某个类 T 的许多实例。 在我们的应用程序中,提取所有这些实例的以下代码需要很长时间: public IList
我是一名优秀的程序员,十分优秀!