Sorry for the late response.

My understanding of Decorator is that its intent is that it's a wrapper 
that you use to add new functionality to a class/object that doesn't 
already have it.  Projecting forward from that, then, you could add 
multiple pieces of functionality onto an object by repeatedly wrapping 
it in decorators - resulting in a chain of decorators, with the 
decorated object at the end.

Quintessential example of this would be, say, the InputStream and 
OutputStream families of I/O objects in Java.  You take any "vanilla" 
stream object (e.g., that writes to a file, a socket, etc.) and then add 
functionality onto it by wrapping it in decorator streams - e.g., 
BufferedOutputStream, PrintStream, etc.

More info at Wikipedia (http://en.wikipedia.org/wiki/Decorator_pattern), 
though admittedly that's not necessarily a canonical source.

Not quite sure whose side of your argument I'm falling out on here 
(yours maybe?) but I hope the additional data point is helpful to you guys.

DR

On 02/17/2010 03:29 PM, Thomas Mercer-Hursh, Ph.D. wrote:
> I'm having a bit of a debate with a colleague about the GoF Decorator
> pattern and I'm wondering what this group thinks.
>
> His position is that the Intent of Decorator specifically states that
> Decorator provides a "flexible alternative to subclassing for extending
> functionality" and that the balance of the pattern description
> reinforces this statement.  He is therefore inclined to use Decorator
> routinely as a means of creating subtypes of a base entity, citing the
> flexibility this provides and the way that it avoids the "crosstab"
> problem which can occur when there are multiple classifications that can
> all apply at the same time to the same base entity.
>
> My read of GoF is that Decorator was specifically intended for dynamic
> additions of functionality particularly in cases which functionality is
> context dependent and/or where the functionality in question is not
> systematically applied to all instances.  E.g., any particular Order
> must be one or the other of an InternalOrder or an ExternalOrder, so I
> would not use Decorator to make that distinction because all Orders are
> one or the other.  But, some Windows have scroll bars and some don't and
> the category No Scroll Bars has no specific functionality associated
> with it, so that is a good example of a context in which to use Decorator.
>
> To me, the preferred approach for dealing with a potential "crosstab"
> generalization problem is to use a combination of Generalization and
> Delegation, i.e., by identifying cohesive spheres of responsibility
> which can be segregated into their own delegate generalization
> hierarchy, one removes one of the possible "dimensions" of the
> crosstab.  Do that enough and one reduces all generalization hierarchies
> to simple ones.
>
> I.e., I would do what decomposition I could do with Generalization and
> Delegation and only resort to Decorator for what was "left over" because
> it didn't fall into the category of the kinds of breakdowns for which
> systematic decomposition was appropriate.
>
> What does this group think?
_______________________________________________
gang-of-4-patterns mailing list
gang-of-4-patterns@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/gang-of-4-patterns

Reply via email to