对象的组成

时间:2011-02-01 21:26:44

标签: oop composition

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

3 个答案:

答案 0 :(得分:2)

好吧,作为一个粗略的过度概括,你应该在servlet中实例化它并将它传递给管理器(通过构造函数参数,或通过setNewClass())...注入依赖项而不是硬盘 - 编码。

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

简短的回答是没有银弹。在不了解所有类之间的硬关系以及角色和责任的情况下,很难说最好的方法。但是在构造函数中实例化几乎从来都不是一个好主意,你应该以某种形式注入依赖(但是从哪里讨论)......

答案 1 :(得分:1)

这让我想起了FFF模式。

创建实例的位置无关紧要。只需创建最适合您的地方,如果您在其他地方需要它,只需应用一些基本的重构。

如果你真的需要去耦,请尝试使用Guice之类的工具,但前提是你确实需要它。

答案 2 :(得分:0)

你应该做后者 - 它将经理与其代表分离。要正确地进行解耦,您应该创建一个定义管理器期望的行为的接口,然后通过控制/依赖注入的反转来提供实现。这将允许您单独测试管理器及其工作类(我将其称为委托,但可能不是)。

编辑 - 这个答案假设java,因为你提到了servlet。

你有经理类,你期待一个接口

class Manager {
    Worker worker;

    Manager(Worker worker) {
        this.worker = workder
    }
}

Worker是一个界面。它定义了行为但不是实现

interface Worker {
    public void doesSomething(); //method definition but  no implementation
}

您现在需要创建一个实现

class WorkerImpl implements Worker {
    // must define a doesSomething() implementation
}

经理才知道它会得到一些工人。您可以提供实现该接口的任何类。这是解耦 - 管理器不受任何特定实现的约束,它只受工人行为的约束。