天天看点

使用delegate进行解耦

MVC架构下,使用

Observer(观察者)模式将核心逻辑代码与

UI界面代码分离似乎天经地义的事,这样做的好处是核心逻辑代码可以独立于

UI代码而存在,从而达到重用的目的。但不幸的是,从笔者经手的代码看,很多程序员并没有注意到这一点。主要问题可能包括以下两个方面:

第一是核心逻辑代码与

UI界面代码相互调用关系错综复杂。由于核心逻辑代码不独立,因而很难进行提取复用。这种情况相对比较常见。

第二个问题解释起来可能更复杂一些。由于缺乏从核心逻辑代码到

UI界面代码的回调机制,程序员可能会被迫使用一些极端的手法来达到侦测指定事件是否发生的目的。比如,我们知道游戏客户端都有一个主循环

main_loop,方法名称通常叫

Update()或

Tick(),用于更新每一帧的游戏动画。这时,程序员可能会在该循环中埋伏一些代码以侦测核心逻辑状态的变化情况,从而达到触发事件的目的。这种手法实现了功能,保持了低耦合,却降低了代码执行效率。

这两个问题的解决之道在于观察者模式。这个模式在实现上还是比较复杂的,对每一个要处理事件都需要定义对应的观察者与被观察者接口。这种代码复杂性曾使很多人望而却步(包括本人

-___-),为此

java中内置了

java.util.Observer与

java.util.Observable接口,以降低使用该模式的代价。

笔者建议的方案是使用

delegate(委托)。没错,就是那个

C#中的

delegate,它能够极低的设计复杂度实现与观察者模式相同的解耦效果。具体实例这里不再列举,因为网上可以找到很多。如果你使用的是

C#,那么你是幸运的;如果你使用的是

C++,那么网上同样可以找到设计好的仿真类库;如果你不幸使用了

VC6,并且实在找到出路了