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. EXPLAIN - 显示语句执行规划

    SYNOPSIS EXPLAIN [ ANALYZE ] [ VERBOSE ] statement DESCRIPTION 描述 这条命令显示PostgreSQL规划器为所提供的语句生成的执行规划. ...

  2. js数组常用方法整理

    学疏才浅,若有不对的地方,希望大家可以帮忙指正出来. 1. Array.push(),向数组的末尾添加一个或多个元素,并返回新的数组长度.原数组改变. 2. Array.pop(),删除并返回数组的最 ...

  3. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1146

    问题介绍:   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1146 MySql语法错误, 但是错 ...

  4. Eclipse Code Recommenders 自动补全(联想)神器

    Eclipse Code Recommenders 可以在eclipse市场中下载.自动补全.模糊匹配.非常有用!

  5. [JOYOI] 1071 LCIS

    拖了好久的LCIS f[i][j]表示a串前i个,b串以b[j]结尾的LCIS长度. 转移时考虑a[i]和b[j]是否相等,如果不等: 那么既然是以j结尾,说明a串前i-1位有一个字符和b匹配了,所以 ...

  6. BUG笔记 1.0

    似乎只要coding,这些代码就要跟我过不去似的 今天在linux上安装了mysql-server,想不到竟然被一个及其简单的问题给难住了. 是的,我竟然无法登陆!!! 在论坛,百度,google上苦 ...

  7. 测试网站链接是否可用(wget和curl)

    一.wget用法案例 系统给的命令参数如下: [root@litong_centos mysql3307]# wget --help GNU Wget 1.14, a non-interactive ...

  8. Django:调用css、image、js

    1.在项目的manage.py同级目录创建static.templates 2.编辑settings.py,在最后加入 STATIC_URL = '/static/' HERE = os.path.d ...

  9. 使用Docker compose编排Laravel应用

    前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环 ...

  10. vue 源码自问自答-响应式原理

    vue 源码自问自答-响应式原理 最近看了 Vue 源码和源码分析类的文章,感觉明白了很多,但是仔细想想却说不出个所以然. 所以打算把自己掌握的知识,试着组织成自己的语言表达出来 不打算平铺直叙的写清 ...