What are the differences between proxy, wrapper or a façade classes
They all seem to be the same to me, they take an implementation, encapsulate it and then methods are
The difference is mostly in the intent. Ultimately, they all do "take an implementation and wrap it", but it's important to communicate the difference.
The wrapper pattern (aka the adapter pattern) takes one interface and adapts it to the other.
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
}
}
A proxy implements an interface for the purpose of providing access to something else (usually something big). A good example is remote procedure calls.
interface PiCalculator {
double CalculatePi();
}
class Ec2PiCalculatorProxy : PiCalculator {
public double CalculatePi() {
// Fire up 10000 of computers in the cloud and calculate PI
}
}
We call it a proxy rather than a wrapper to communicate that it's tunnelling through to another component to fulfil the results. I don't see this the same as the adapter pattern, because that's about converting interfaces.
A façade differs because it hides the collaboration of multiple classes behind a simpler interface or class.
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);
}
}