2011-02-01 51 views
3

我有一个类作为经理,并做一些工作。 当应用程序服务器启动时启动的servlet实例化此管理器。 我需要添加另一个可以完成其他工作的类,并且需要与经理协调。 我正在考虑将该类作为实例变量添加到管理器中。 我应该让管理器实例化新类(就像在构造函数中一样),还是让servlet实例化新类并在管理器实例化之后调用manager.setNewClass()?对象的组合

回答

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 
} 

经理只知道它得到了一些工人。您可以提供任何实现该接口的类。这是脱钩的 - 管理者不受任何特定实施的约束,它仅限于工人的行为。

+0

您会详细说明如何制定一个界面来定义经理期望的行为,我不知道您要去哪里? – bmw0128 2011-02-01 21:34:39

2

那么,作为一个粗略的泛化,你应该在servlet中实例化它并传递给管理器(通过构造器参数或者通过setNewClass())...注入依赖关系而不是硬编码它们。

但是,根据您的确切用例,即使这可能不是正确的答案。用Builder来构建经理类可能会更好。这样,构建器管理整个管理器的构造(包括任何依赖关系),而不是将其硬编码到servlet中。这会将依赖关系从servlet移出并移植到构建器中(您可以在测试和其他代码中更好地处理这些问题)。

简短的回答是,没有银弹。如果不知道所有类别之间的困难关系以及角色和责任,就很难说最好的方法。但在构造函数中实例化几乎不是一个好主意,你应该以某种形式或另一种形式注入依赖项(但是从哪里开始辩论)...

1

这让我想起了FFF模式。

创建实例的位置并不重要。只要创造出最适合你的地方,并且如果你在其他地方需要它,就应用一些基本的重构。

如果您确实需要解耦,请尝试使用一些工具,如Guice,但只有在您确实需要解耦时才可以。