Ответ 1
Разница в основном заключается в намерении. В конечном счете, все они "берут реализацию и завершают ее", но важно сообщить разницу.
Образец оболочки (так называемый шаблон адаптера) принимает один интерфейс и адаптирует его к другому.
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);
}
}