oop - 适配器模式和依赖

标签 oop design-patterns

我对适配器类毫无疑问。我知道适配器类的目标是什么。什么时候应该使用。我的疑问是关于类(class) build 。我检查了一些教程,他们都说我应该将“Adaptee”类作为我的“适配器”的依赖项传递。 例如

Class SampleAdapter implements MyInterface
{
    private AdapteeClass mInstance;
    public SampleAdapter(AdapteeClass instance)
    {
         mInstance=instance;
    }
}

这个例子是从维基百科复制过来的。如您所见,AdapteeClass 作为依赖项传递到我的对象。问题是为什么?如果我正在更改一个对象的接口(interface) 很明显我将使用"new"接口(interface)而我不需要“旧”接口(interface)。为什么我需要在适配器外部创建“旧”类的实例。有人可能会说我应该使用依赖注入(inject),这样我就可以传递任何我想要的东西,但这是适配器——我需要更改具体类的接口(interface)。我个人认为下面的代码更好。

Class SampleAdapter implements MyInterface
{
    private AdapteeClass mInstance;
    public SampleAdapter()
    {
         mInstance= new AdapteeClass();
    }
}

你怎么看?

最佳答案

我想说的是,当涉及到复杂对象时(除非类是 BuilderFactory),您应该始终避免在类中使用 new 运算符,以减少耦合并使您的代码更好地可测试。当然,像 List 或 Dictionary 或值对象这样的对象可以在类方法中构造(这可能是类方法的目的!)

例如,假设您的 AdapteeClass 是一个 Remote Proxy。如果你想使用单元测试,你的单元测试将不得不使用真正的代理类,因为在你的单元测试中没有办法替换它。

如果您使用第一种方法,您可以在运行单元测试时轻松地将模拟或伪造注入(inject)构造函数,以便您可以测试所有代码路径。

Google 有一个 guide on writing testable code其中更详细地描述了这一点,但一些要点是:

Warning Signs for not testable code

  • new keyword in a constructor or at field declaration
  • Static method calls in a constructor or at field declaration
  • Anything more than field assignment in constructors
  • Object not fully initialized after the constructor finishes (watch out for initialize methods)
  • Control flow (conditional or looping logic) in a constructor
  • Code does complex object graph construction inside a constructor rather than using a factory or builder
  • Adding or using an initialization block

关于oop - 适配器模式和依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8838337/

相关文章:

.net - 每个方法一个测试类?

使用原型(prototype)、构建器模式的 Java 对象克隆(附加类成员)

Java参数签名解析

java - 是否有针对此问题的分布式软件和一个后端数据库的良好模式?

java - Java中的单例模式和静态类有什么区别?

c++ - 引用父变量的静态常量

java - 依赖于多个子类实例的实例创建模式

c++ - 析构函数和解除分配的函数有什么区别?

c++ - 用direct2d创建位图图集, "current bitmap"指的是什么?

java - java中Instanceof的正确用法