设计要求:

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. SpringBoot 整合 Jpa

    项目目录结构 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  2. 班尼特·A·麦克道尔 - 一个交易者的资金管理系统(2013年5月26日)

    <一个交易者的资金管理系统:如何确保利润并避免破产风险> 作 者:班尼特·A·麦克道尔 系 列:“引领时代”金融投资系列-世界交易经典译丛 出 版:万卷出版公司 字 数:155千字 阅读完 ...

  3. 利用Visual Studio Natvis 框架简化C++的变量调试工作

    相信用C++开发过UI界面的程序员都对其变量调试工作头痛不已,由于复杂的继承关系,要查看到某个变量往往需要一系列的层层深入的点击,如下图就是查看TextBox的Text的例子: 为了查看Text属性, ...

  4. 【Tomcat MyEcplise】MyEcplise添加一个新的Server,Tomcat8.5报错

    添加新的Tomcat添加不进去,报错: The Apache Tomcat installation at this directory is version 8.5.11.  A Tomcat 8. ...

  5. 关于Java代码优化的44条建议!

    关于Java代码优化的N条建议! 本文是作者:五月的仓颉 结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,作者的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼 ...

  6. ckfinder在IE10,IE9中的弹出框不能选择,或者不能上传解决方法

    在IE9,或IE10中ckfinder在IE10,IE9中的弹出框不能选择,或者不能上传解决方法   把弹出框嵌入到jquery dialog中.可以解决 I did: // javascript f ...

  7. Codeforces Round #313 (Div. 1) Gerald&#39;s Hexagon

    http://codeforces.com/contest/559/problem/A 题目大意:按顺序给出一个各内角均为120°的六边形的六条边长,求该六边形能分解成多少个边长为1的单位三角形. 解 ...

  8. 某公司java面试经历

    为什么说某公司.由于确实面完了最后挂了回来也没记住公司叫啥名字.是老乡兼好友内推去的小公司,名字有点长,所以也没记住. 公司确实太小,所说是外包公司.然后面回来后跟ACM的前学长说了,他们仅仅说所以不 ...

  9. WAF防御能力评测及工具

    本篇文章介绍如何从常规攻击的防御能力来评测一款WAF.一共覆盖了十六种攻击类型,每种类型均从利用场景(攻击操作的目的),注入点(漏洞产生的地方,比如说大多数WAF都会较全面地覆盖来自GET请求的攻击, ...

  10. Javascript函数式编程的一些例子[转载]

    函数式编程风格 通常来讲,函数式编程的谓词(关系运算符,如大于,小于,等于的判断等),以及运算(如加减乘数等)都会以函数的形式出现,比如:    a > b通常表示为:    gt(a, b)/ ...