本帖最后由 boss_george 于 2014-10-29 00:31:22 编辑

解决方案 »

  1.   

    非要归类的话,这属于广义的IoC(见http://bbs.csdn.net/topics/390916159#post-398423336)。不是直接调用,而是使用一个中间介质,把对方法的调用隐藏起来。也能看作是一个Command模式的弱化版本。你这个是参数Type --> delegate的映射,Command模式的经典形式是 name -> ICommand 的映射,也有变化形式是 TCommand -> ICommandHandler<TCommand> 的映射(CQRS中的Command)。总之都是把执行体封装、隐藏起来,使用中间介质将其和另一个概念映射。这种方式的好处一个是调用的统一性,一个是在调用实际逻辑前后都可以做一些额外处理,比如log,甚至可以基于条件路由到别的逻辑去。另外,你这个完全可以使用泛型简化调用,GeneralCallMessageObject.InvokeSpecificCall<T>(T data);就可以了。在程序局部可以使用这样的弱化版本,如果大规模使用,还是需要用Command模式。一是因为弱化的版本没有基于接口(或者说没有基于OO的视角),扩展性不够;二是因为delegate所属的对象没有处于管理下,其生命周期会难以控制。
      

  2.   

    不属于GoF设计模式中的具体一种,因为C#和C++根本不同,实现相同设计意图根本不需要照搬C++使用的模式,这就是C#代码很难说使用了什么模式的一个原因。设计模式(我说的是GoF的设计模式)和语言是相关的,我特别强调,设计模式其实是为编译器提供更抽象的功能而做的特定的代码展开。因此设计模式对于C#来说大多数是没用的。当然,C#抽象程度更高,所以它实现更高级的设计意图,而语言本身不能做到,才需要套用模式,这些模式和GoF的完全不是一回事了。你可以管你的这个代码叫“Dispatcher模式”——不管别人怎么叫,反正我是这么叫的,既有自己发明的成分,也和一些人的叫法不谋而合。你可以google "dispatcher pattern"