我有一个类作为经理,并做一些工作。 当应用程序服务器启动时启动的servlet实例化此管理器。 我需要添加另一个可以完成其他工作的类,并且需要与经理协调。 我正在考虑将该类作为实例变量添加到管理器中。 我应该让管理器实例化新类(就像在构造函数中一样),还是让servlet实例化新类并在管理器实例化之后调用manager.setNewClass()?对象的组合
Q
对象的组合
3
A
回答
0
你应该做后者 - 它将经理从其代表中分离出来。为了正确地进行解耦,应该创建一个接口来定义管理器期望的行为,然后通过反转控制/依赖注入来提供实现。这将允许您单独测试经理及其工人类(我称之为委托,但可能不是)。
编辑 - 这个答案假定java是因为你提到了servlet。
你有你的管理器类,它在你期望的接口
class Manager {
Worker worker;
Manager(Worker worker) {
this.worker = workder
}
}
工人是一个接口。它定义了水煤浆而不是执行
interface Worker {
public void doesSomething(); //method definition but no implementation
}
你现在需要创建一个实现
class WorkerImpl implements Worker {
// must define a doesSomething() implementation
}
经理只知道它得到了一些工人。您可以提供任何实现该接口的类。这是脱钩的 - 管理者不受任何特定实施的约束,它仅限于工人的行为。
2
那么,作为一个粗略的泛化,你应该在servlet中实例化它并传递给管理器(通过构造器参数或者通过setNewClass()
)...注入依赖关系而不是硬编码它们。
但是,根据您的确切用例,即使这可能不是正确的答案。用Builder来构建经理类可能会更好。这样,构建器管理整个管理器的构造(包括任何依赖关系),而不是将其硬编码到servlet中。这会将依赖关系从servlet移出并移植到构建器中(您可以在测试和其他代码中更好地处理这些问题)。
简短的回答是,没有银弹。如果不知道所有类别之间的困难关系以及角色和责任,就很难说最好的方法。但在构造函数中实例化几乎不是一个好主意,你应该以某种形式或另一种形式注入依赖项(但是从哪里开始辩论)...
1
相关问题
- 1. 组合XmlWriter对象?
- 2. c#对象组合
- 3. Javascript组合对象数组
- 4. 广泛的对象组合
- 5. C++的对象组合
- 6. 类组合而不是对象组合?
- 7. 将nsdata对象组合成nsmutabledata对象
- 8. 组合匹配的对象数组
- 9. 组合链接对象的数组
- 10. 序列化组合对象
- 11. 组合ROCR性能对象
- 12. 拼合Javascript对象数组
- 13. 组合框对象列表
- 14. 对象到数组集合
- 15. PHP合并数组对象
- 16. C++混合对象数组
- 17. 如何组合javascript对象?
- 18. 组合可观察对象
- 19. 在powershell中组合对象
- 20. 组合/合并可观察对象
- 21. 按属性组合对象数组
- 22. 合并数组对象数组中
- 23. 组(集合)的对象的项
- 24. 面向对象编程和对象组合,如何把组合属性?
- 25. 合并新的数组对象,以现有的对象JS
- 26. 根据公共值组合/合并数组中的对象
- 27. 结合数组中的对象
- 28. 如何合计数组对象的值?
- 29. C#的WinForms组合框 - 从对象
- 30. 是不同的IQueryable对象组合?
您会详细说明如何制定一个界面来定义经理期望的行为,我不知道您要去哪里? – bmw0128 2011-02-01 21:34:39