Skip to content

Instantly share code, notes, and snippets.

@AlexArchive
Created October 20, 2013 11:46
Show Gist options
  • Select an option

  • Save AlexArchive/7068483 to your computer and use it in GitHub Desktop.

Select an option

Save AlexArchive/7068483 to your computer and use it in GitHub Desktop.
Double Dispatch Pattern
namespace Messaging
{
interface IHandler
{
}
interface IMessageHandler<in MessageType> : IHandler
{
void ProcessMessage(MessageType message);
}
interface IMessage
{
void Dispatch(IHandler handler);
}
class MessageBase<MessageType> : IMessage where MessageType : class, IMessage
{
public void Dispatch(IHandler handler)
{
MessageType welcomeMessage = this as MessageType;
if (welcomeMessage != null)
{
DynamicDispatch(handler, welcomeMessage);
}
}
protected void DynamicDispatch(IHandler handler, MessageType self)
{
IMessageHandler<MessageType> handlerTarget = handler as IMessageHandler<MessageType>;
if (handlerTarget != null)
{
handlerTarget.ProcessMessage(self);
}
}
}
class WelcomeMessage : MessageBase<WelcomeMessage>
{
public string WelcomeText { get; set; }
}
class WelcomeMessageHandler : IMessageHandler<WelcomeMessage>
{
public void ProcessMessage(WelcomeMessage message)
{
Console.WriteLine(message.WelcomeText);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment