Found an excellent SO question that shows the usage, but to me the overall purpose of Plan and Pattern is to create a compositional unit of observable as opposed to a composed observable. Semantics, I know, but to me it seems a little easier to use this syntax then the various other "Join" methods. It allows you to separate the join from the projection altogether, so you can store intermediate plans and compose them with other observables whenever you want.
For example:
// Suppose we have observables o1, o2, ..., o9.
// All IObservable<int>.
var o1and2 = o1.And(o2); // Store this bad boy for later use. Pattern<int, int>
var o5and6and9 = o5
.And(o6)
.And(o9)
.Then((t1, t2, t3) => t1 + t2 + t3); // Plan<int>
var o3and7 = o3
.And(o7)
.Then((t1, t2) => string.Format("Result: {0}", t1 + t2)); // Plan<string>
var o12ando8and6 = o1and2
.And(o8)
.And(o6)
.Then((t1, t2, t3, t4) => ((decimal) t1, t2, t3.ToString(), t4));
// Plan<(decimal, int, string, int)>
// "When" groups similar results together.
// It will fire when any of the Patterns give a result.
var obs1 = Observable
.When(o1and2.Then((t1,t2) => t1+t2), o5and6and9); // IObservable<int>
var obs2 = Observable.When(o3and7); // IObservable<string>
var obs3 = Observable.When(o12ando8and6); // IObservable<(decimal, int, string,int)>
SO Article:
Reactive Extensions for .NET (Rx): Take action once all events are completed
Also, found an RX document that actually helped in understanding HOW to use this: http://www.clipcode.net/mentoring/RxReferenceLibrary.pdf [dead]