欢迎来到天天文库
浏览记录
ID:40313351
大小:24.83 KB
页数:4页
时间:2019-07-30
《设计模式20Mediator》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、无废话C#设计模式之二十:Mediator意图用一个中介对象来封装一系列对象的交互。中介者使得各对象不需要显式相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。场景我们知道,一个网络游戏往往有很多大区。每一个大区可以是一组服务器,也可以是多组服务器,在这里假设一个大区是一组服务器。为了效率,一般每个大区都会有一个数据库,玩家的创建角色、充值、消费行为只是在这一个大区中有效。现在公司有了新的需求,那就是玩家的一些信息能在多个大区中共享。比如,在注册的时候就把玩家的账户信息写入多个信息共享的大区,玩家在某个大区中充值需要“通知”其它大区修改账户余额,
2、玩家在某个大区中消费也需要“通知”其它大区修改账户余额。如果我们现在有ABC三个大区,下面的方法可以实现需求:l 网站的注册方法调用A、B和C大区的注册方法l A大区的充值方法调用B和C的充值方法l B大区的充值方法调用A和C的充值方法l C大区的充值方法调用A和B的充值方法l A大区的消费方法调用B和C的充值方法l B大区的消费方法调用A和C的充值方法l C大区的消费方法调用A和B的充值方法我想,没有人会这么做吧。你肯定会想到在一个统一的地方去维护所有大区的信
3、息,任何一个大区的行为不直接和其它大区的行为关联,它们所有的行为都提交到一个统一的地方(假设它是AccountSystem)去处理。这么做有几个好处:l 各大区不需要关心还有哪些其它的大区,它只直接和AccountSystem对话。l 只需要调整AccountSystem就能调整各大区之间的交互行为,比如我们仅仅希望A和B大区共享信息、C和D大区共享信息,那么对于这种交互策略的改变也需要修改AccountSystem。l 有利于大区的扩充,有了新的大区后,我们不用在大区中考虑它的交互行为,统一交给AccountSys
4、tem去安排。现在,再来看看引入AccountSystem后的通讯:l 网站调用AccountSystem的注册方法(1)l AccountSystem调用A、B和C大区的注册方法(2)l A、B和C大区的充值方法调用AccountSystem的充值方法(3)l A、B和C大区的消费方法调用AccountSystem的充值方法(4)l AccountSystem的充值方法调用A、B和C大区的专有充值方法(只针对本大区的充值)(5)l AccountSystem的充值方法调用A
5、、B和C大区的专有消费方法(只针对本大区的消费)(6)至此,你已经实现了中介者模式。你可能会觉得,(1)和(2)非常类似门面模式,没错,它确实就是门面模式,而有了(3)~(6)的行为,AccountSystem也就是一个中介者的角色了。示例代码usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceMediatorExample{classProgram{staticvoidMain(string[]args){AccountSystemaccountSystem=newAc
6、countSystem();GameSystemgameArea1=newGameArea1(accountSystem);GameSystemgameArea2=newGameArea2(accountSystem);accountSystem.RegisterGameArea(gameArea1);accountSystem.RegisterGameArea(gameArea2);stringuserName="aaa";accountSystem.CreateAccount(userName);gameArea1.Recharge(userName,2
7、00);gameArea2.Consume(userName,50);accountSystem.QueryBalance(userName);}}classAccountSystem{privateDictionaryuserBalance=newDictionary();privateListgameAreaList=newList();publicvoidRegisterGameArea(GameSystemgs){gameAreaList.Add(gs);
8、}publicvoidCreateAccount(s
此文档下载收益归作者所有