3、Socket网络通信的设计与实现------类适配器
除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。不管是对象适配器还是类适配器,都是为了复用适配者类的功能。
SocketPackage就是成熟的套接字软件包,也就是Adaptee适配者类,包含创建套接字、绑定套接字、监听套接字、连接套接字等成熟方法; Socket是目标抽象类Target,定义了客户希望的方法; SocketAdapter为适配器类,继承自Socket类和SocketPackage类,将成熟软件包里面的方法转为Socket类中客户希望的方法。
成熟的套接字软件包实现代码如下:
#ifndef _SOCKET_PACKAGE_H_
#define _SOCKET_PACKAGE_H_
#include <iostream>
#include <string>
using namespace std;
//套接字包(可以被复用)
class SocketPackage
{
public:
void CreateSpecificSocket()
{
cout << "创建套接字" << endl;
}
void BindSpecificSocket()
{
cout << "绑定套接字" << endl;
}
void ListenSpecificSocket()
{
cout << "监听套接字" << endl;
}
void ConnecSpecifictSocket()
{
cout << "连接套接字" << endl;
}
};
#endif
SocketAdapter套接字适配器类和SocketPackage套接字包类不在是组合的关系,SocketAdapter继承于Socket类和SocketPackage,当调用SocketAdapter套接字适配器类中的方法,将会调用其基类SocketPackage的相应方法,通过继承的方式实现对适配者类的功能复用。套接字适配器类实现代码如下:
#ifndef _SOCKET_H_
#define _SOCKET_H_
#include "SocketPackage.h"
//抽象套接字类
class Socket
{
public:
//创建套接字
virtual void CreateSocket() = 0;
//绑定套接字
virtual void BindSocket() = 0;
//监听套接字
virtual void ListenSocket() = 0;
//连接套接字
virtual void ConnectSocket() = 0;
};
//套接字适配器(类适配器)
class SocketAdapter : public Socket, SocketPackage
{
public:
//创建套接字
void CreateSocket()
{
CreateSpecificSocket();
}
//绑定套接字
void BindSocket()
{
BindSpecificSocket();
}
//监听套接字
void ListenSocket()
{
ListenSpecificSocket();
}
//连接套接字
void ConnectSocket()
{
ConnecSpecifictSocket();
}
};
#endif
测试程序实现代码如下:
#include <iostream>
#include "Socket.h"
using namespace std;
int main()
{
//创建套接字适配器对象
Socket * pSocketAdapter = new SocketAdapter();
//使用适配器进行套接字操作
pSocketAdapter->CreateSocket();
pSocketAdapter->BindSocket();
pSocketAdapter->ListenSocket();
pSocketAdapter->ConnectSocket();
//销毁操作
delete pSocketAdapter;
pSocketAdapter = NULL;
return 0;
}
编译并执行,程序结果如下:
适配器类继承于目标抽象类和适配者类,当调用适配器类的方法时,在该方法内部将调用其基类,也就是适配者类中相应的方法,通过继承的方式,实现复用适配者类的功能。
不管是对象适配器还是类适配器,都是为了实现功能的复用。