"Адаптер заставляет вещи работать после того, как они спроектированы; Bridge заставляет их работать
работать, прежде чем они. [GoF, p219] "
Фактически, шаблон Adapter полезен, когда у вас есть существующий код, будь то сторонний или внутренний, но не под вашим контролем или не изменяемый, чтобы полностью соответствовать интерфейсу, который вам нужен к. Например, у нас есть SuperWeaponsArray, который может управлять множеством устройств конца света.
public class SuperWeaponsArray {
/*...*/
public void destroyWorld() {
for (Weapon w : armedWeapons) {
w.fire();
}
}
}
Отлично. За исключением того, что мы понимаем, что в нашем арсенале есть ядерное устройство, которое значительно предшествует переходу на интерфейс с оружием. Но нам бы очень хотелось, чтобы это работало здесь ... так что же нам делать ... вклинивать это!
NukeWeaponsAdaptor - основан на нашем классе Nuke, но экспортирует интерфейс оружия. Сладкий, теперь мы можем уничтожить мир. Это кажется чем-то вроде клуджа, но это заставляет вещи работать.
Шаблон Bridge - это то, что вы реализуете заранее - если вы знаете, что у вас есть две ортогональные иерархии, он предоставляет способ разделить интерфейс и реализацию таким образом, что вы не получите безумное количество занятий. Допустим, у вас есть:
Типы файловых объектов MemoryMappedFile и DirectReadFile. Допустим, вы хотите иметь возможность читать файлы из различных источников (возможно, Linux или Windows и т. Д.). Bridge поможет вам избежать:
MemoryMappedWindowsFile
MemoryMappedLinuxFile
DirectReadWindowsFile
DirectReadLinuxFile