代理,包装或外观类之间有什么区别
它们对我来说似乎都是一样的,它们采用实现,封装它然后在调用封装对象的方法的包装器/代理/外观类上调用方法。
请说明与实例不同的原因。
由于
答案 0 :(得分:49)
差异主要在于意图。最终,他们都会“采取实施并将其包装”,但重要的是要传达差异。
包装器模式(也称为适配器模式)采用一个接口并使其适应另一个接口。
interface A { void Foo(); }
interface B { void Bar(); }
class AAdapter : B {
private A a;
public AAdapter(A a) { this.a = a; }
void Bar() {
a.Foo(); // just pretend foo and bar do the same thing
}
}
代理实现了一个接口,用于提供对其他东西的访问(通常是大的东西)。一个很好的例子是远程过程调用。
interface PiCalculator {
double CalculatePi();
}
class Ec2PiCalculatorProxy : PiCalculator {
public double CalculatePi() {
// Fire up 10000 of computers in the cloud and calculate PI
}
}
我们将其称为代理而不是包装器来表示它正在通过隧道传输到另一个组件来实现结果。我不认为这与适配器模式相同,因为那是关于转换接口。
外观不同,因为它隐藏了更简单的接口或类背后的多个类的协作。
class Facade {
private A a;
private B b;
// Provides an interface to A and B by delegating to these members
public void DoSomethingWithAAndB() {
MagicToken x = a.DoSomethingAndGetAResult();
b.DoSomethingWithMagic(x);
}
}
答案 1 :(得分:25)
许多设计模式具有相同的结构,如您所见。
差异在于它们存在的原因 - 为什么它们的存在。
代理可以作为代表远程代理的本地对象。
包装器用于包装现有对象以扩展/更改其行为。
存在简化复杂API并展示简单API的外观。
答案 2 :(得分:6)
AFAIK没有一种叫做包装的模式。似乎更像是一种行为模式的通用定义。
<强>门面强>
不要包装一个类,而是几个。目的是使复杂的API更易于使用。 .NET示例是使用WebClient
/ HttpWebRequest
HttpWebResponse
类
<强>代理强>
代理充当原始对象,但包含其他逻辑,例如在完成后处理连接或清理资源。
如果您使用的是WCF,则可以通过提供WCF服务接口来生成客户端代理。
其他模式
还有一些模式也是“包装”: