25.2.2 转移范例(2)
WebHost类有效地封装了主机的行为,并提供了有用的功能,避免了不必要的调用和数据结构。这个类甚至提供了一个有用的功能-- 当创建了一个WebHost,可以通过这个对象获取多个页面,节省了代码,还可能使得程序运行得更快。
WebHost类的实现充分利用了netwrklib库,而且没有把这个类的任何内部工作方式向用户公开。为了实现这个抽象,这个类需要一个数据成员:
- // WebHost.h
- #include "netwrklib.h"
- class WebHost
- {
- // Omitted for brevity
- protected:
- Connection* mConnection;
- };
对应的源文件使得netwrklib库中包含的功能面目一新。首先,构造函数为指定的主机构建一个HostRecord。由于WebHost类处理的是C++(www.cppentry.com) string,而不是C风格的字符串,所以对inHost使用了c_str()以便获得一个const char*,然后执行一个const转换,修复了newwrklib在const方面的错误。得到的HostRecord用于创建一个Connection,新创建的Connection保存在mConnection数据成员中以备后用: - WebHost::WebHost(const string& inHost)
- {
- const char* host = inHost.c_str();
- HostRecord* theHost = lookupHostByName(const_cast<char*>(host));
- mConnection = connectToHost(theHost);
- }
后面对getPage()的调用将保存的连接传递给netwrklib的retrieveWebPage()函数,然后以C++(www.cppentry.com) string的方式返回值:- string getPage(const string& inPage)
- {
- const char* page = inPage.c_str();
- string result = retrieveWebPage(mConnection, const_cast<char*>(page));
- return result;
- }
熟悉网络的读者可能会注意到,一直保持打开某个主机的连接是一个不当的行为,而且没有遵循HTTP规范。我们在这个例子中选择了优雅而不是礼仪。
正如您所看到的,WebHost类为C库提供了一个面向对象的封装。通过提供一个抽象,您可以修改底层实现而不用影响客户代码,您还可以提供额外的特性。这些特性可以包括连接引用计数、解析页面以及根据HTTP规范在特定时间后自动关闭连接并且在下一次getPage()调用的时候自动重新打开连接等。