Настоящее имя шаблона «container_of» - PullRequest
5 голосов
/ 17 февраля 2012

Например, в разработке драйвера для Linux можно найти макрос container_of.По сути, это оператор, обратный к ->, который дает указатель на содержащую структуру, если вы получили указатель на член.

Кроме этого, из блога Грега Кроа я нашел этот шаблон в списке и хэш реализация Pintos.

Ответы [ 2 ]

2 голосов
/ 29 июня 2013

Настоящее имя этого шаблона - "container_of ()." Попытка вписать этот C-ism в таксономию шаблона проектирования Java или C ++ тщетна. Дело не в том, чтобы связать ответственность или назначить или делегировать что-либо. Если вы должны думать в этих терминах, то это «грязное обобщенное наследование». Если вам не нужно думать в этих терминах, тогда это намного менее грязно.

0 голосов
/ 17 февраля 2012

Я бы сказал, что это не очень характерно Chain Of Responsibility.Единственная причина, по которой вам нужен указатель на структуру родительского контейнера, заключается в размещении функциональности родительского контейнера в пределах досягаемости содержащихся элементов.Таким образом, может рассматриваться как деталь реализации, необходимая для того, чтобы запрос мог обрабатывать "цепочку" до тех пор, пока он не будет обработан на правильном "уровне".Содержащиеся отношения, этот «правильный» уровень - это всего лишь один уровень вверх, а нарастание не проходит через достаточно уровней (поскольку существует только один уровень), чтобы вызвать большой интерес в качестве идеального примера шаблона.Тем не менее, общие идеи, стоящие за Chain of Responsibility, остаются в силе;запрос делается в той точке цепочки, которая не может его обработать, и обрабатывается в другой точке изменения, которое может.

При небольшом неуниверсальном отношении «контейнер / содержимое» соединение этих двухзвено цепи может стать довольно тесным.Например, в ваших примерах отсутствует общая структура обработки «команд» (так как набор командного языка невелик), и такая среда обычно требует (для безопасности типов) объект Command / Message.Это большая нагрузка для списка, который просто хочет позволить своим элементам напрямую уведомлять на уровне элементов, что они хотят удалить его из списка.

И да, есть страница шаблона C2за это ... Если вы согласны с моими рассуждениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...