您的位置:首页 > 运维架构 > 网站架构

系统架构三日谈(二)__对象间的连接

2008-03-20 12:02 204 查看
我们知道,常见的网络拓扑结构主要有:星型,环型,全连接,总线型。
那么在设计软件时,我们可以参考以上几种形式来实现对象与对象之间的连接。

问题:如何将对象A,B,C用总线型(软总线)进行连接?
方法:感觉好象没这个必要,真要实现可用事件驱动进行模拟?

问题:设有三个对象ABC,A收到消息后,要依次传送至B和C,怎么做?
方法:将A,B,C,用链表连接。这类似于环型,在设计模式中称责任链。

问题:设有对象A和B,要把二个对象串起来,怎么做?
方法:A中设一个指向B的指针,B中设一个指向A的指针,这是面向对象设计中最为常见的手法。

问题: 设有对象A,B,C,要把三个对象串起来,怎么做?
方法1:全连接
你还是可以采用A中设两个指针,分别指向B,C;B中也设两个指针分别指向A,C;C中设两指针指向A和B。这种连接方式就是全连接型。缺点是占用空间,指针的维护麻烦;优点是访问对象快速,一步到位。

方法2:星型
你可以先建一个Base对象,其内部设三个指针,分别指向A,B,C;再在A,B,C中分别设一个指针指向Base对象。这样在A对象中要访问B对象时,可先访问Base对象,再通过Base访问B对象。这种通讯方式就是所谓的星型。此方式的特点是访问对象的速度还可以,两步到位,指针维护的工作量也不大。
举例:
(1) linux内核中有个全局变量current,任务切换后做的第一件事就是更新这个指针。我感觉这种current型的指针就是采用星型的设计。
(2) 在设计WEB Server时,当accept一个来自于browser的连接时,就需要创建一个SOCKET对象或结构 (不仅仅是socket fd,通常还要包括port,hostname等),还要创建一个请求控制块HttpRequest(包括HTTP version,Content-Length等),准备用来解析HTTP, 在解析完HTTP头进入应用脚本(ASP)时,有时要创建(或拾取)一个SESSION,如何把SOCKET,HttpRequest,SESSION这三个对象串起来?(即在任何一个对象中都可访问另外两个对象)。
此时用星形设计就比较好。即设一个全局性的对象(或结构变量)SERVER,内含三个指针,分别指向这三种对象,而在SOCKET,HttpRequest,SESSION中各设一个指针指向SERVER,伪码如下:




typedef struct SERVER ...{




...{


SOCKET *psock;


HttpRequest *preq;


SESSION *psession;


...


}






typedef struct SOCKET...{




...{


SERVER *base;


int fd;


...


}






typedef struct HttpRequest...{




...{


SERVER *base;


char http_ver[9];


int content_length;


...


}






typedef struct SESSION...{




...{


SERVER *base;


int SID;


char user_name[8];


...


}




main




...{


SERVER svrdata,*svr=&svrdata;


...


fd = accept();


sock = malloc(sizeof(SOCKET));


sock->base = &svr;


svr->psock = sock;


...


req = malloc(sizeof(HttpRequest));


req->base = &svr;


svr->preq = req;


...


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: