Миксин подходит, когда вы добавляете немного поведения в свой класс. например возможность перечисления в случае типа коллекции. Вы можете смешивать в своем классе столько наборов поведения, сколько захотите. Это хороший способ повторно использовать общий код; вы в основном получаете кучу методов бесплатно.
С другой стороны, декоратор - это скорее подлый перехватчик. Он предоставляет тот же открытый интерфейс, что и целевой объект, содержит целевой объект, которому он делегирует все клиентские вызовы; однако он украшает вызов с некоторой предварительной и / или последующей обработкой. например если я пишу код для MyCollection и хочу, чтобы все вызовы этого типа регистрировались. Я мог бы получить новый декоратор MyCollectionWithTimeStampedLogging, оба производные от базы ICollection, чтобы они выглядели идентично клиенту. Декоратор может взять экземпляр ICollection в качестве параметра ctor и передать ему вызовы. например Добавить будет выглядеть так
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());
}