我对适配器类毫无疑问。我知道适配器类的目标是什么。什么时候应该使用。我的疑问是关于类(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();
}
}
你怎么看?
最佳答案
我想说的是,当涉及到复杂对象时(除非类是 Builder
或 Factory
),您应该始终避免在类中使用 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/