Una mezcla es apta cuando agrega algún comportamiento a su clase. p.ej. la capacidad de enumerar en caso de un tipo de colección. Puede mezclar tantos conjuntos de comportamientos en su clase como desee. Es una buena forma de reutilizar el código común; básicamente obtienes muchos métodos gratis.
Un decorador por el contrario es más un interceptor furtivo. Expone la misma interfaz pública que el objeto de destino, contiene un objeto de destino al que delega todas las llamadas de los clientes; sin embargo, decora la llamada con algún procesamiento previo y/o posterior. p.ej. si estoy escribiendo código contra MyCollection y quiero que se registren todas las llamadas a este tipo. Podría derivar un nuevo decorador MyCollectionWithTimeStampedLogging ambos derivados de una base de ICollection para que se vean idénticos al cliente. El decorador tomaría una instancia de ICollection como un param del ctor y delegaría llamadas a él. p.ej. Agregar se vería así
public void Add(int item)
{
_logger.log(String.Format("{0} Add called with param {1}", DateTime.Now, item.ToString());
_collection.Add(item);
_logger.log(String.Format("{0} Add completed with param {1}", DateTime.Now, item.ToString());
}
¿Entonces un decorador está un poco más cerca de lo que hace la Programación Orientada a Aspectos (AOP), y un mixin simplemente modifica sus clases existentes? – leeand00
@ leeand00 - tipo de; AOP es mucho más que simples decoradores, creo. Los mixins son más frecuentes en los lenguajes dinámicos, con un mixin, puedes mezclar un montón de métodos en la definición de tu clase. p.ej. puede escribir implementaciones Cargar y Guardar (que reflejan en una clase y leer/escribir propiedades públicas en el disco) en un Módulo Persistente, luego mezclar esto en múltiples clases. Todas estas clases ahora pueden persistir en el disco. – Gishu
Con AOP (con el que estoy más familiarizado que ... say mixins) puede especificar 3 cosas diferentes que pueden suceder con las interfaces seleccionadas. Puede especificar una acción previa, una acción posterior y, en su lugar, una acción. – leeand00