设为首页 加入收藏

TOP

25.2.2 转移范例(2)
2013-10-07 15:36:33 来源: 作者: 【 】 浏览:66
Tags:25.2.2 转移 范例

25.2.2  转移范例(2)

WebHost类有效地封装了主机的行为,并提供了有用的功能,避免了不必要的调用和数据结构。这个类甚至提供了一个有用的功能-- 当创建了一个WebHost,可以通过这个对象获取多个页面,节省了代码,还可能使得程序运行得更快。

WebHost类的实现充分利用了netwrklib库,而且没有把这个类的任何内部工作方式向用户公开。为了实现这个抽象,这个类需要一个数据成员:

  1. // WebHost.h  
  2. #include "netwrklib.h"  
  3. class WebHost  
  4. {  
  5. // Omitted for brevity  
  6. protected:  
  7. Connection* mConnection;  
  8. };  

对应的源文件使得netwrklib库中包含的功能面目一新。首先,构造函数为指定的主机构建一个HostRecord。由于WebHost类处理的是C++(www.cppentry.com) string,而不是C风格的字符串,所以对inHost使用了c_str()以便获得一个const char*,然后执行一个const转换,修复了newwrklib在const方面的错误。得到的HostRecord用于创建一个Connection,新创建的Connection保存在mConnection数据成员中以备后用:
  1. WebHost::WebHost(const string& inHost)  
  2. {  
  3. const char* host = inHost.c_str();  
  4. HostRecord* theHost = lookupHostByName(const_cast<char*>(host));  
  5. mConnection = connectToHost(theHost);  
  6. }  

后面对getPage()的调用将保存的连接传递给netwrklib的retrieveWebPage()函数,然后以C++(www.cppentry.com) string的方式返回值:
  1. string getPage(const string& inPage)  
  2. {  
  3. const char* page = inPage.c_str();  
  4. string result = retrieveWebPage(mConnection, const_cast<char*>(page));  
  5. return result;  
  6. }  

熟悉网络的读者可能会注意到,一直保持打开某个主机的连接是一个不当的行为,而且没有遵循HTTP规范。我们在这个例子中选择了优雅而不是礼仪。

正如您所看到的,WebHost类为C库提供了一个面向对象的封装。通过提供一个抽象,您可以修改底层实现而不用影响客户代码,您还可以提供额外的特性。这些特性可以包括连接引用计数、解析页面以及根据HTTP规范在特定时间后自动关闭连接并且在下一次getPage()调用的时候自动重新打开连接等。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇25.1 跨平台开发 下一篇25.2.2 转移范例(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·哈希表 - 菜鸟教程 (2025-12-24 20:18:55)
·MySQL存储引擎InnoDB (2025-12-24 20:18:53)
·索引堆及其优化 - 菜 (2025-12-24 20:18:50)
·Shell 中各种括号的 (2025-12-24 19:50:39)
·Shell 变量 - 菜鸟教 (2025-12-24 19:50:37)