Очень похожи. Все создают "промежуточный" объект, который "более удобен" для клиента. Но еще интереснее то, что банда четырех и про Adapter и про Decorator говорит: "известен также под именем Wrapper". Так в чем же разница?
1. Adapter (Адаптер).
Нужно использовать компоненты, интерфейс которых не совпадает с "нашими" интерфейсами. Нужен "переходник", который интерфейс компонента приведет к тому виду, с которым нам удобно работать. Например, есть сторонняя библиотека и есть наша система, работающая с иными интерфейсами. Изменить библиотеку мы не можем, менять свою реализацию не хотим (а вдруг потом будет другая библиотека, что тогда?).
2. Wrapper (Обёртка).
Есть функциональность, которая не является объектом, например, библиотека. Хотим сделать из нее что-то объектное.
3. Decorator (Декоратор).
Хотим добавить функциональность к объекту, но не наследовать. Похоже на servlet filter.
Цель: добавить в класс новое поведение.
4. Proxy (Заместитель).
Упаковывает объект для управления доступом к нему. Для этого бывают разные причины:
- удаленный заместитель управляет доступом к удаленному объекту (например, stub объект в rmi);
- виртуальный заместитель управляет доступом к ресурсу, создание которого требует больших затрат;
- защитный заместитель контролирует доступ к ресурсу в соответствии с системой привилегий.
Итак:
Adapter : меняет интерфейс, не меняет поведение
Wrapper : предоставляет интерфейс
Decorator : меняет поведение; изменение интерфейса как побочный продукт.
Proxy : управляет доступом к объекту
1. Adapter (Адаптер).
Нужно использовать компоненты, интерфейс которых не совпадает с "нашими" интерфейсами. Нужен "переходник", который интерфейс компонента приведет к тому виду, с которым нам удобно работать. Например, есть сторонняя библиотека и есть наша система, работающая с иными интерфейсами. Изменить библиотеку мы не можем, менять свою реализацию не хотим (а вдруг потом будет другая библиотека, что тогда?).
2. Wrapper (Обёртка).
Есть функциональность, которая не является объектом, например, библиотека. Хотим сделать из нее что-то объектное.
3. Decorator (Декоратор).
Хотим добавить функциональность к объекту, но не наследовать. Похоже на servlet filter.
Цель: добавить в класс новое поведение.
4. Proxy (Заместитель).
Упаковывает объект для управления доступом к нему. Для этого бывают разные причины:
- удаленный заместитель управляет доступом к удаленному объекту (например, stub объект в rmi);
- виртуальный заместитель управляет доступом к ресурсу, создание которого требует больших затрат;
- защитный заместитель контролирует доступ к ресурсу в соответствии с системой привилегий.
Итак:
Adapter : меняет интерфейс, не меняет поведение
Wrapper : предоставляет интерфейс
Decorator : меняет поведение; изменение интерфейса как побочный продукт.
Proxy : управляет доступом к объекту
Comments
Post a Comment