Marlon实现的MVC+M模式有效地解除了Controller对象之间的耦合关系,其中,他引入了IColleague接口对Controller的相关方法进行了抽象。不过,这样的接口并非必须,正如我在《Strategy模式与Delegate委托》一文中提到的接口与委托之间的关系,我们完全可以用委托来代替IColleague接口的定义,使整个结构变得更加的灵活。由于引入了委托与消息对象的映射关系,因此在Controller类的MessageNotification()方法中,不再需要用switch语句来判断消息的值,而是直接根据映射关系,调用委托对象所指代的方法逻辑。Mediator类可以修改为:
public class Mediator
{
IDictionary<string,Action<object>> m_List = new Dictionary<string,Action<object>>();
public void Register(string message,Action<object> callback)
{
m_List.Add(message,callback);
}
public void NotifyColleagues(string message, object args)
{
if (m_List.ContainsKey(message))
{
m_List[message](args);
}
}
}
{
IDictionary<string,Action<object>> m_List = new Dictionary<string,Action<object>>();
public void Register(string message,Action<object> callback)
{
m_List.Add(message,callback);
}
public void NotifyColleagues(string message, object args)
{
if (m_List.ContainsKey(message))
{
m_List[message](args);
}
}
}
与之对应的,FileSelectorController可以修改为:
public FileSelectorController()
{
Mediator.Register(Messages.DirectorySelectedChanged,
(obj) =>
{
LoadFiles((DirectoryDisplayItem)obj);
});
}
{
Mediator.Register(Messages.DirectorySelectedChanged,
(obj) =>
{
LoadFiles((DirectoryDisplayItem)obj);
});
}
至于最初定义在Controller类的MessageNotification()方法,则被匿名函数所代替,已经不再需要了。