Yo diría que no es muy útil Chain Of Responsibility
. La única razón por la que necesita un puntero a la estructura del contenedor principal es colocar la funcionalidad del contenedor primario al alcance de los elementos que contiene. Como tal, podría ser visto como un detalle de implementación requerido para permitir que una solicitud se filtre hasta la "cadena" hasta que se maneje en el "nivel" correcto.
Con una relación contenedor/contenido, ese nivel "correcto" es solo un nivel arriba, y el goteo no pasa por suficientes niveles (ya que hay un solo nivel) para generar mucho interés como un ejemplo ideal de el patrón. Aún así, las ideas generales detrás de Chain of Responsibility
aún se mantienen; se realiza una solicitud en un punto de la cadena que no puede manejarlo, y se maneja en un punto diferente del cambio que puede.
Con una pequeña relación recipiente/contenido no genérica, el acoplamiento de esta cadena de dos enlaces puede ser bastante apretado. Por ejemplo, sus ejemplos carecen de un marco de manejo de "comando" genérico (dado que el conjunto de idiomas de comando es pequeño), y dicho marco generalmente requiere (para la seguridad del tipo) un Objeto de Comando/Mensaje. Eso es una gran cantidad de gastos generales, para una lista que simplemente quiere que sus elementos notifiquen directamente en el nivel del elemento que desean ser eliminados de la lista.
Y sí, there is a C2 pattern's page for it ... Si está de acuerdo con mi razonamiento.
Solo para agregar a su lista, Windows tiene la macro 'CONTAINING_RECORD 'similar. No sé de un nombre genérico para el 'patrón'. –
Cuando se utiliza para implementar estructuras de datos de contenedores, impulsar llama a esta técnica "contenedores intrusivos" en el mundo C++. Aunque container_of es más general y útil en otros contextos que para implementar estructuras de datos generales como listas y tablas hash. – nos