大话设计模式
字体: 16 + -

第221章

时间:1月13日地点:大b房间人物:大b,校

大b:“假如你有10个全能工人,10样相同工作。工作都要做完,而且大喊一声所有人去工作。”

小a:“嗯?”

大b:“当条件变了,工人不是全能,但是工作相同。”

小a:“ok,问题不大。”

大b:“条件再变,工作不是相同,但工人是全能。”

小a:“ok,问题不大。”

大b:“以上三种情况在现实生活中是很少发生的,最多的情况是这样:10个工人,每人会做一种工作,10样工作。你用一份名单写着谁做什么。但你不认识任何人。这个时候你怎么指挥呢?”

小a:“可以一个个的叫工人,然后问他们名字,认识他们,查名单,告诉他们做什么工作。”

大b:“这是个办法。还可以怎么指挥呢?”

小a:“你可以直接叫出他们名字,告诉他们干什么,不需要知到他是谁。”

大b:“看起来很简单。但如果你要指挥10万人呢?而且人员是流动的,每天的人不同,你每天拿到一张文档。”

小a:“这样的话就比较麻烦了。”

大b:“其实很简单,最常用的做法是,你把这份名单贴在墙上,然後大喊一声,所有人按照去看,按照自己的分配情况去做。”

小a:“嘿嘿!这个方法不错喔!”

大b:“这里利用的关键点是‘所有工人自己认识自己’,你不能苛求每个工人会做所有工作,不能苛求所有工作相同,但你能要求所有工人都认识自己。”

小a:“嗯。”

大b:“再想想我们开始的程序,每个工人对应着pa,pb,pc,pd,pe……所有的工人都使工人p,每个工人会做的东西不一样runpa,runpb,runpc,你有一份名单visitor(重载)记录着谁做什么工作。”

小a:“为什么不把这些方法的方法名做成一样的,那就可以解决了。例如,我们每个pa,pb,pc都加入一个run方法,然后run内部再调用自己对应的runpx()方法。”

大b:“有些时候从不同的角度考虑,或者因为实现的复杂度早成很难统一方法名。例如上边指挥人工作的例子的例子,其实run方法就是大叫一声去工作,因为每个工人只会做一种工作,所以能行,但我们不能要求所有人只能会做一种事情,这个要求很愚蠢。所以如果每个工人会干两种或者多种工作呢,也就是我pa有runpa()walkpa()等等方法,pb有runpb()climbpb()等等。这个时候按照名单做事才是最好的办法。”