Может кто-либо разрабатывать шаблон разработки Моста и Шаблон "декоратор" для меня. Я нашел это подобным в некотором роде. Я не знаю, как отличить его?
Мое понимание - то, что в Мосту, это разделяет реализацию от интерфейса, обычно можно только применить одну реализацию. Декоратор является видом обертки, можно перенести столько, сколько Вы можете.
Например,
Шаблон "мост"
class Cellphone {
private:
Impl* m_OS; // a cellphone can have different OS
}
Шаблон "декоратор"
class Shirt {
private:
Person * m_p; //put a shirt on the person;
}
Декоратор должен соответствовать интерфейсу объекта, который вы украшаете. то есть он имеет те же методы и позволяет перехватывать аргументы на входе и результат на выходе. Вы можете использовать это, чтобы обеспечить дополнительное поведение декорированному объекту при сохранении того же интерфейса / контракта. Обратите внимание, что интерфейс декоратора может предоставлять дополнительные функциональные возможности для создания более полезного объекта.
У Моста такого ограничения нет. Клиентский интерфейс может отличаться от базового компонента, обеспечивающего реализацию, и, таким образом, он соединяет мост между клиентским интерфейсом и фактической реализацией (которая может быть неудобной для клиента, может быть изменена и т. Д.)
Ваша реализация шаблона декоратора не совсем верна. Было бы лучше, если бы вы это сделали:
class PersonWearingShirt : IPerson
{
private:
IPerson * m_p; //put a shirt on the person;
}
Идея в том, что когда вы украшаете класс , вы открываете точно такой же интерфейс. Это заставит ваш "украшенный" экземпляр выглядеть и действовать как оригинал. Это позволяет вам обернуть экземпляр несколько раз несколькими декораторами, но обращаться с ним точно так же, как с исходным экземпляром.
Брайан прав. Я добавлю, что концептуально клиент будет «знать», что он использует мост к базовому объекту, но с декоратором клиент не сможет знать, что между ним и целевым объектом есть слой декоратора.
Назначение моста - создать уровень абстракции для защиты клиента. Назначение декоратора - добавить объекту функциональность без ведома клиента. Большинство декораторов передают все вызовы функций непосредственно указателю на их родительский класс, за исключением функций, непосредственно связанных с тем, что декоратор предназначен для изменения.