在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯后要在程序中实现相应的功能。如:
一个聊天程序有如下定义:
1……登陆
2……获取好友列表
3……修改自己资料
…
…
N……退出
每个功能由如下函数实现:
登陆
Void Login(UserIinfouser,Messagemsg);
获取好友列表
void GetFriendList(UserInfouser,Messagemsg);
修改自己资料
void ModifySelfInfomation(UserInfouser,Messagemsg);
…
…
退出
Void Logout(UserInfouser,Messagemsg);
那现在我们要将它一一对应起来,我们该怎么做呢?很多人也许会这样做
public static void Analyze(UserInfo user, Message message) ...{ switch (msg.Class)//Class是的类型标志,下同 ...{ case 1: Login(user, message); break; case 2: GetFriendList(user, message); break; case 3: ModifySelfInfomation(user, message); break; … case N: Logout(info, msg); break; default: break; } } |
这样做看起来没有什么不妥。但是……如果协议条数非常多或者说很复杂呢?比如说:我的协议是二级甚至是三级分类的呢?用更多的switch和case?这样显然不是一个好主意。在C++和Delphi中我们可以用函数指针数组来很好的解决这个问题。那我们在是不是也可以这样去解决这个问题呢?答案是肯定的。我们可以在中用委托数组来解决这个问题。
让我们先定义一个委托和它的数组:
private delegate void AnalyzerHandler(UserInfo user, Message message);
static AnalyzerHandler[] MainAnalyzer;
然后将函数都放到这个数组里:
MainAnalyzer = new AnalyzerHandler[] ...{ Login, GetFriendList, ModifySelfInfomation, … Logout } |
那我们怎么调用呢?很简单,这样就行了!
public static void Analyze (UserInfo user, Message message) ...{ if (message.Class > MainAnalyzer.Length||message.Class<0) //检查Class |
最新评论