设计要求:

1.企业信息系统框架、第三方产品通过接口层进行分层。

2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类。(软件设计要求:模块要求松,接口要求紧)。

设计步骤:

1.报文的接受与发送抽象类;

  C++与C语言设计区别:C语言中有个句柄,原因是需要分配一个结构体资源,把发送和接受的信息存储起来。而C++中由于有类的存在,可以直接将这个句柄内容存储在子类中,不需要再单独设置。

2.测试界面面向抽象类框架集成,开始初步完成测试界面.

4.厂商的产品实现(自己的头文件和.cpp文件)

5.搭建加解密产品接入信息系统

1)创建加解密抽象类头文件

2)厂商实现具体内容

3)接入测试层

6.将测试界面的框架集成为一个类(有两种方式:继承与组合)

下面是代码:

1.报文的发送与接收抽象类框架。

 #pragma once

 //写一套接口,用纯虚函数写;用来接收和发送数据
class CSocketProtocol
{
public:
//客户端初始化
virtual int Init_Socket(/*in*/) = ; //客户端发送报文
virtual int Send_Socket(unsigned char *sendBuf/*in*/, int sendLen/*in*/) = ; //客户端接收报文
virtual int Recv_Socket(unsigned char *recvBuf/*in*/, int *recvLen/*out*/) = ; //客户端释放资源
virtual int Destroy_Socket(/*in*/) = ; //虚析构函数,可以用来释放所有的子类和基类资源
virtual ~CSocketProtocol()
{
;
}
};

2.单个厂商对此抽象类的实现(包含了厂商的头文件和厂商代码的实现)

 #pragma once
#include<string>
#include "CSocketProtocol.h" //注意C++与C最大不通过在这里:C++可以把信息直接存储在类中;C需要创建一个结构体来收发内容
class ProductA : public CSocketProtocol
{
public:
//客户端初始化
virtual int Init_Socket(/*in*/); //客户端发送报文
virtual int Send_Socket(unsigned char *sendBuf/*in*/, int sendLen/*in*/); //客户端接收报文
virtual int Recv_Socket(unsigned char *recvBuf/*in*/, int *recvLen/*out*/); //客户端释放资源
virtual int Destroy_Socket(/*in*/); //设置类的私有属性,将收发的内容存储在类中。
private:
unsigned char *BaoWen;
int len; };
 #pragma once
#include "ProductA.h" //客户端初始化
int ProductA::Init_Socket(/*in*/)
{
BaoWen = NULL;
len = ;
return ;
} //客户端发送报文
int ProductA::Send_Socket(unsigned char *sendBuf/*in*/, int sendLen/*in*/)
{
if (sendBuf == NULL)
return -; this->BaoWen = (unsigned char *)malloc(sizeof(unsigned char)*sendLen);
if (!BaoWen)
{
return -;
}
memcpy(BaoWen, sendBuf, sendLen);
len = sendLen;
return ;
} //客户端接收报文
int ProductA::Recv_Socket(unsigned char *recvBuf/*in*/, int *recvLen/*out*/)
{
if (recvBuf ==NULL)
return -;
if (recvLen == NULL)
return -;
memcpy(recvBuf, BaoWen, len);
*recvLen = this->len;
return ;
} //客户端释放资源
int ProductA::Destroy_Socket(/*in*/)
{
if (BaoWen != NULL)
{
free (BaoWen);
BaoWen = NULL;
len = ;
}
return ;
}

3.加解密的抽象类框架。

 #pragma once
#include <iostream> class EncDec
{
public:
//加密函数
virtual int EncData(unsigned char *plain, int plainLen, unsigned char *miBuf, int *miLen) = ;
//解密函数
virtual int DecData(unsigned char *miBuf, int miLen, unsigned char *plainBuf, int *palinLen) = ;
~EncDec()
{
;
}
};

4.单个厂商加解密的函数实现(包含两部分:厂商的头文件和代码实现)

 #pragma once
#include"EncDec.h"
#include "des.h" class HwEncDec : public EncDec
{
public:
//加密函数
virtual int EncData(unsigned char *plain, int plainLen, unsigned char *miBuf, int *miLen);
//解密函数
virtual int DecData(unsigned char *miBuf, int miLen, unsigned char *plainBuf, int *palinLen);
};
 #include"HwEncDec.h"
#include "des.h" //加密函数
int HwEncDec::EncData(unsigned char *plain, int plainLen, unsigned char *miBuf, int *miLen)
{
if (plain == NULL)
return -;
if (miBuf == NULL)
return -;
if (miLen == NULL)
return -;
int ret = ;
ret = DesEnc(plain, plainLen, miBuf, miLen);
if (ret != )
{
printf("DesEnc()error:[%d]\n", ret);
return ret;
}
return ret;
}
//解密函数
int HwEncDec::DecData(unsigned char *miBuf, int miLen, unsigned char *plainBuf, int *palinLen)
{
if (miBuf == NULL)
return -;
if (plainBuf == NULL)
return -;
if (palinLen == NULL)
return -;
int ret = ;
ret = DesDec(miBuf, miLen, plainBuf, palinLen);
if (ret != )
{
printf("DesDec()error:[%d]\n", ret);
return ret;
} return ret;
}

5.测试界面的集成调用:

 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"CSocketProtocol.h"
#include"ProductA.h"
#include "EncDec.h"
#include "HwEncDec.h" //测试框架步骤:
//1.先创建一个接口抽象类指针;指向具体的第三方产品
//2.设计接收和发送报文的内存及其长度变量
//3.测试界面面向抽象类框架集成:设计一个函数将;将抽象类的指针和接发报文内容集成起来。 //3.测试界面面向抽象类框架集成
int SekSendAndRecv11(CSocketProtocol *csp, EncDec *ecdc, unsigned char *in, int inLen, unsigned char *out, int *outLen)
{
int ret = ;
//创建接收密文的内存和长度
unsigned char miWen[] = { };
int miwenLen = ;
//创建接受明文的内存和长度(可以不创建,和密文用同一个)
unsigned char plain[] = { };
int plainLen = ;
//客户端初始化
ret = csp->Init_Socket();
if (ret)
{
printf("Init_Socket()error:[%d]\n", ret);
goto End;
} //发送数据前先进行加密
ret = ecdc->EncData(in, inLen, miWen, &miwenLen);
if (ret)
{
printf("EncData()error:[%d]\n", ret);
goto End;
} //客户端发送报文
ret = csp->Send_Socket(miWen, miwenLen);
if (ret)
{
printf("Send_Socket()error:[%d]\n", ret);
goto End;
} //客户端接收报文
ret = csp->Recv_Socket(plain, &plainLen);
if (ret)
{
printf("Recv_Socket()error:[%d]\n", ret);
goto End;
} //接受的报文为加密内容,需要解密。
ret = ecdc->DecData(plain, plainLen, out, outLen);
if (ret)
{
printf("DecData()error:[%d]\n", ret);
goto End;
}
End:
//客户端释放资源
ret = csp->Destroy_Socket(); return ;
} int main()
{
int ret = ;
//1.先创建一个接口抽象类指针;指向具体的第三方产品
CSocketProtocol *csp = NULL;
csp = new ProductA ;
EncDec *ecdc = NULL;
ecdc = new HwEncDec; //2.设计接收和发送报文的内存及其长度变量
unsigned char in[];
int inLen;
unsigned char out[];
int outLen;
strcpy((char *)in, "ahgquwquwqeyqufnaskmc");
inLen = ; //3.设计一个函数将;将抽象类的指针和接发报文内容集成起来。
ret = SekSendAndRecv11(csp, ecdc, in, inLen, out, &outLen);
if (ret)
{
printf("SekSendAndRecv()error:[%d]\n", ret);
return ret;
}
printf("out: %s\n", out);
printf("outLen: %d\n", outLen); //不要忘了释放基类与子类的资源(虚析构函数可以释放基类与派生类的资源释放)
delete csp; system("pause");
return ret;
}

6.将测试界面的框架集成为一个类(有两种方式:继承与组合)

 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include"CSocketProtocol.h"
#include"ProductA.h"
#include "EncDec.h"
#include "HwEncDec.h" class mainOp
{
public:
mainOp()
{
csp = NULL;
ecdc = NULL;
}
mainOp(CSocketProtocol *csp, EncDec *ecdc)
{
this->csp = csp;
this->ecdc = ecdc;
}
void setCSP(CSocketProtocol *csp)
{
this->csp = csp;
}
void setEcDc(EncDec *ecdc)
{
this->ecdc = ecdc;
}
int SekSendAndRecv(unsigned char *in, int inLen, unsigned char *out, int *outLen)
{
int ret = ;
//创建接收密文的内存和长度
unsigned char miWen[] = { };
int miwenLen = ;
//创建接受明文的内存和长度(可以不创建,和密文用同一个)
unsigned char plain[] = { };
int plainLen = ;
//客户端初始化
ret = csp->Init_Socket();
if (ret)
{
printf("Init_Socket()error:[%d]\n", ret);
goto End;
} //发送数据前先进行加密
ret = ecdc->EncData(in, inLen, miWen, &miwenLen);
if (ret)
{
printf("EncData()error:[%d]\n", ret);
goto End;
} //客户端发送报文
ret = csp->Send_Socket(miWen, miwenLen);
if (ret)
{
printf("Send_Socket()error:[%d]\n", ret);
goto End;
} //客户端接收报文
ret = csp->Recv_Socket(plain, &plainLen);
if (ret)
{
printf("Recv_Socket()error:[%d]\n", ret);
goto End;
} //接受的报文为加密内容,需要解密。
ret = ecdc->DecData(plain, plainLen, out, outLen);
if (ret)
{
printf("DecData()error:[%d]\n", ret);
goto End;
}
End:
//客户端释放资源
ret = csp->Destroy_Socket();
return ;
}
private:
CSocketProtocol *csp;
EncDec *ecdc;
}; int main()
{
int ret = ;
//1.先创建一个接口抽象类指针;指向具体的第三方产品
CSocketProtocol *csp = NULL;
csp = new ProductA;
EncDec *ecdc = NULL;
ecdc = new HwEncDec; //继承类的两种使用,调用有参构造和采用注入方式:
//第一种:采用外部注入
mainOp *mop = new mainOp;
mop->setCSP(csp);
mop->setEcDc(ecdc); //第二种:采用调用有参构造
//mainOp *mop = new mainOp(csp,ecdc); //2.设计接收和发送报文的内存及其长度变量
unsigned char in[];
int inLen;
unsigned char out[];
int outLen;
strcpy((char *)in, "ahgquwquwqeyqufnaskmc");
inLen = ; ret = mop->SekSendAndRecv(in, inLen, out, &outLen);
if (ret)
{
printf("SekSendAndRecv()error:[%d]\n", ret);
return ret;
}
printf("out: %s\n", out);
printf("outLen: %d\n", outLen); //不要忘了释放基类与子类的资源(虚析构函数可以释放基类与派生类的资源释放)
delete csp;
delete ecdc;
delete mop; system("pause");
return ret;
}

7.代码中的注意点:

  1)头文件“des.h”是我此次所用的加密文件;由于太大,就不上传了,你们可以换成自己的就行。

企业信息系统集成框架(设计思路)C++模式的更多相关文章

  1. 企业信息系统集成框架(设计思路)C模式

    1.客户端.h文件 #pragma once #include<stdlib.h> //A程序员定义接口形式和调用模式 //初始化句柄 typedef int(*Init_Socket)( ...

  2. App 自动化框架设计思路

    最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...

  3. Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路

    前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...

  4. Javascript框架设计思路图

    这个系列的随笔都是关于Javascript框架设计一书的读书笔记(作者是司徒正美),不是本人原创!!! 一.简介: 1.市面上主流的JS框架,大多数是由一个个模块组合而成,模块化是大多数让软件所遵循的 ...

  5. 开源项目CIIP(企业信息管理系统框架).2018.0904版更新介绍

    源码: https://github.com/tylike/CIIP https://gitee.com/ciip/CIIP 一,CIIP的目标是什么? 更加简单,快速的建立信息类管理系统.让实施人员 ...

  6. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  7. 开源项目CIIP(企业信息管理系统框架).2018.1.0910版更新介绍-上周工作总结

    又狂撸了一周的代码.简化了0904版本的多数操作. 上一次更新时,总共需要10步,这次简化成3步.嗯嗯,自我感觉不错. 重要的:在创建项目时,可以选择常用模块啦! 第一步:启动CIIP.Designe ...

  8. Socket开发框架之框架设计及分析

    虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...

  9. Sizzle源码分析:一 设计思路

    一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...

随机推荐

  1. 消除Xcode 5中JosnKit类库的bit masking for introspection of objective-c 警告

    Xcode 5中苹果对多个系统框架及相关类库进行了改进.之前建立的项目在Xcode 5中重新编译会产生一些新问题. JosnKit是常用的轻量级Josn解析类,在Xcode 5中: BOOL work ...

  2. 高并发环境下,Redisson实现redis分布式锁

    原文:http://tlzl0526-gmail-com.iteye.com/blog/2378853 在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好, ...

  3. 轻量级的REST中间件

    轻量级的REST中间件 纯净的REST中间件,绝对的轻量级,不需要安装任何三方控件 基于HTTPS.SYS和WEBSOCKET通信,支持海量并发 支持跨越DELPHI6~DELPHI10.2.2的开发 ...

  4. AS3.0纯代码编写的两款loading效果

    AS3.0纯代码编写的两款loading效果 效果一 效果二 代码很简单,实现的原理一样,只不过矩形用到了Matrix类,对注册点进行了调整,效果可用于视频播放器缓冲时的loading效果,下面看代码 ...

  5. Android 卡顿优化 2 渲染优化

    1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那 ...

  6. [Android自定义控件] Android Scroller工具类和GestureDetector的简单用法

    转载:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View ...

  7. Linux下的基础命令

    在容器环境中很多时候要确定底层操作系统是什么和什么版本,网上找了一把,发现了一些比较有用的命令,从其他地方转过来,参考 # uname -a # 查看内核/操作系统/CPU信息 # head -n / ...

  8. 七.使用fastJson解析器

    1.到入jar包 <!-- 添加fastjson 依赖包. --> <dependency> <groupId>com.alibaba</groupId> ...

  9. HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs

    题意: 1.找一个字符串s使得 s不是给定母串的子串 2.且s要最短 3.s在最短情况下字典序最小 hash.,,结果t掉了...加了个姿势怪异的hash值剪枝才过.. #include <cs ...

  10. ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数) 1.A,示例(Sample) 返回顶 ...