I’ve said it before and I’ll say it again. I hate UML. That doesn’t mean there aren’t pictures that can say 1000 words. Here’s approximately 6000 words on the subject of substitution patterns. Substitution patterns are patterns where you want functionality to expose a certain interface, but need some sort of bridging logic to achieve that.
One nice thing about all of these patterns is that they describe an object. Patterns that involve several actors are harder to name and explain. Here, you’ve got the object that implements the pattern, and the target. The target never knows anything about the pattern (which is why I haven’t labelled them in the diagrams).
A proxy is an object that behaves exactly like its target. Usually it only exists to cross a machine or process boundary. WCF and RMI create proxies all of the time. I’ve written more about proxies before, but I ran with the more colloquial use of the term, where proxy and decorator are basically the same thing. I’m using the formal terminology here, but it’s still probably time we just accepted that common practice treats them as the same.
A square peg in a round hole. Used typically to deal with interfacing issues.
A round peg in a round hole. Decorator differs from proxy in that it changes behaviour.
Not a classic Gang of Four pattern, although it’s technically a special case of decorator. Here you have two implementations: a primary implementation and a fallback implementation. Typically, the primary implementation is a remote proxy and the fallback is a dummy class that just throws exceptions, but obviously other arrangements are possible. The circuit breaker flips between the two depending on the behaviour of the primary implementation. If connectivity goes down or performance degrades unacceptably, subsequent calls are routed to the fallback until the circuit breaker decides to try the primary again. This prevents the calling system from contributing to the load on the remote system. There’s a good implementation using Castle DynamicProxy over on Davy Brion’s blog (it conflates the circuit breaker with the fallback).
I’ve marked the Fallback target in this case because it is an actor in the pattern. The remote target is still unaware of the circuit breaker.
Multiple round pegs, one round hole. Not really anything to do with trees.
Loads of pegs, lots of shapes, one round hole. Used to simplify a subsystem.