Allowing messages to be passed to listeners
Personally I prefer polymorphism instead of conditions in such cases, as it helps to keep big conditions in a clean fashion - each condition in it's own class. As an example, in .NET they have generic event-handlers (subscribers) and following class system takes place (or something along these lines):

abstract class EventArgs { ... } // your abstract data class, Message if you will
class MyEventArgs : EventArgs { } // and it's implementation

abstract class EventHandler&lt;T&gt; // an abstract Subscriber
{ 
    public abstract Notify(T args); // Subscriber::notify() in your example
} 

class MyEventHandler : EventHandler&lt;MyEventArgs&gt;  // an implementation of a subscriber for one specific case, which would be MyEventArgs
{
    public Notify(MyEventArgs args) { ... }
}