3、Socket网络通信的设计与实现------类适配器

除了对象适配器模式之外。适配器模式另一种形式。那就是类适配器模式,类适配器模式和对象适配器模式最大的差别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。无论是对象适配器还是类适配器。都是为了复用适配者类的功能。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQXBlTGlmZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="color:rgb(255,0,0); line-height:26px; font-size:18px; font-family:SimSun">

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;
}

编译并运行,程序结果例如以下:



    适配器类继承于目标抽象类和适配者类。当调用适配器类的方法时。在该方法内部将调用其基类,也就是适配者类中对应的方法。通过继承的方式。实现复用适配者类的功能。

无论是对象适配器还是类适配器,都是为了实现功能的复用。

C++设计模式之适配器模式(二)的更多相关文章

  1. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  2. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  3. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  4. 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)

      桥接模式Bridge   Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来   意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展.  意图解析 依赖倒置原 ...

  5. C#设计模式之六适配器模式(Adapter Pattern)【结构型】

    一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...

  6. C#设计模式(7)——适配器模式(Adapter Pattern)(转)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...

  7. JAVA学习笔记--策略设计模式与适配器模式

    一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...

  8. C#设计模式(7)——适配器模式

    一.概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 二.模型 三.代码实现 using System; /// 这里以 ...

  9. 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式

    前言 ​ 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...

随机推荐

  1. _ 下划线 vue mixins 混入 变量前有下划线 变量不起作用

    _ 下划线 vue mixins 混入 变量前有下划线 变量不起作用

  2. 关于html页面元素语义化的一点思考

    这几天在看招聘公告前端工程师的要求基本都附带了html语义化的要求,所以稍微关注了下这方面的知识.对于其中的一点就是要求页面元素在去除css样式之后还能有良好的布局引发了我一点思考.作为前端刚入门的我 ...

  3. Chrome浏览器安装React developer tools

    1. 到 https://github.com/facebook/react-devtools 下载 react-devtools 2. 进入 react-devtools 目录 运行命令  npm ...

  4. 优先队列 || POJ 1442 Black Box

    给n个数,依次按顺序插入,第二行m个数,a[i]=b表示在第b次插入后输出第i小的数 *解法:写两个优先队列,q1里由大到小排,q2由小到大排,保持q2中有i-1个元素,那么第i小的元素就是q2的to ...

  5. Hibernate中tx.commit()

    hibernate.cfg,xml文件中的自动提交事务是false.主键生成策略是native. 在表的映射继承是手动提交事务(即:tx.commit())无法发出sql语句,把数据插入到数据库的表中 ...

  6. css--css选择器,伪类

    前戏 前面我们说过CSS规则由选择器和声明组成,我们要给标签设置属性,那我们就要找到对应的标签,CSS选择器可以帮我们找到我们需要的标签 css选择器有: 标签选择器 类选择器 ID选择器 全局选择器 ...

  7. Java之字符,字符串替换

    /** 4. 字符串的替换操作 1. String replace(char oldChar,char newChar) //将新字符替换旧字符 3. String replaceFirst(Stri ...

  8. docker guide

    centos docker community version install: yum -y install docker # install docker systemctl start dock ...

  9. python 05 关于对python中引用的理解

    数据的在内存中的地址就是数据的引用. 如果两个变量为同一个引用,那么这两个变量对应的数据一定相同: 如果两个变量对应的数据相同,引用不一定相同. 通过id(数据)可以查看数据对应的地址,修改变量的值, ...

  10. centos7下安装Python3.7(与python2共存)

    2019-01-22   22:50:05 centos7默认安装的是python2.7,然而python2基本上要淘汰了,所以有必要安装最新的python3 python,g++这些工具一般安装在/ ...