代理、包装器或外观类之间有什么区别
它们对我来说似乎都是一样的,它们采用一个实现,封装它,然后在调用封装对象方法的包装器/代理/外观类上调用方法。
请通过示例说明它们为何不同。
谢谢
代理、包装器或外观类之间有什么区别
它们对我来说似乎都是一样的,它们采用一个实现,封装它,然后在调用封装对象方法的包装器/代理/外观类上调用方法。
请通过示例说明它们为何不同。
谢谢
区别主要在于意图。最终,他们都会“采取实施并包装它”,但传达差异很重要。
包装器模式(又名适配器模式)采用一个接口并将其适配到另一个接口。
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);
}
}
如您所见,许多设计模式具有相同的结构。
不同之处在于它们存在的原因——它们存在的原因。
代理在那里充当代表远程对象的本地对象。
包装器用于包装现有对象以扩展/更改其行为。
外观的存在是为了简化复杂的 API 并改为公开一个简单的 API。
AFAIK 没有称为包装器的模式。似乎更像是一种行为模式的通用定义。
正面
不要包装一个类,而是几个。目的是使复杂的 API 更易于使用。.NET 示例是WebClient
使用HttpWebRequest
/HttpWebResponse
代理人
代理充当原始对象,但包含其他逻辑,例如处理连接或完成后清理资源。
如果您使用 WCF,您可以通过提供 WCF 服务接口来生成客户端代理。
附加模式
还有一些模式也是“包装器”: