企业信息系统集成框架(设计思路)C++模式
设计要求:
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++模式的更多相关文章
- 企业信息系统集成框架(设计思路)C模式
1.客户端.h文件 #pragma once #include<stdlib.h> //A程序员定义接口形式和调用模式 //初始化句柄 typedef int(*Init_Socket)( ...
- App 自动化框架设计思路
最近在整理和学习Appium+Java 自动化框架,对APP自动化框架的部分设想参考了一些文章,先进行整理下: 框架的思路一: 思考引入:https://www.cnblogs.com/yunfeio ...
- Mybatis学习之自定义持久层框架(二) 自定义持久层框架设计思路
前言 上一篇文章讲到了JDBC的基本用法及其问题所在,并提出了使用Mybatis的好处,那么今天这篇文章就来说一下该如何设计一个类似Mybatis这样的持久层框架(暂时只讲思路,具体的代码编写工作从下 ...
- Javascript框架设计思路图
这个系列的随笔都是关于Javascript框架设计一书的读书笔记(作者是司徒正美),不是本人原创!!! 一.简介: 1.市面上主流的JS框架,大多数是由一个个模块组合而成,模块化是大多数让软件所遵循的 ...
- 开源项目CIIP(企业信息管理系统框架).2018.0904版更新介绍
源码: https://github.com/tylike/CIIP https://gitee.com/ciip/CIIP 一,CIIP的目标是什么? 更加简单,快速的建立信息类管理系统.让实施人员 ...
- RPC框架设计思路
RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...
- 开源项目CIIP(企业信息管理系统框架).2018.1.0910版更新介绍-上周工作总结
又狂撸了一周的代码.简化了0904版本的多数操作. 上一次更新时,总共需要10步,这次简化成3步.嗯嗯,自我感觉不错. 重要的:在创建项目时,可以选择常用模块啦! 第一步:启动CIIP.Designe ...
- Socket开发框架之框架设计及分析
虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...
- Sizzle源码分析:一 设计思路
一.前言 DOM选择器(Sizzle)是jQuery框架中非常重要的一部分,在H5还没有流行起来的时候,jQuery为我们提供了一个简洁,方便,高效的DOM操作模式,成为那个时代的经典.虽然现在Vue ...
随机推荐
- 消除Xcode 5中JosnKit类库的bit masking for introspection of objective-c 警告
Xcode 5中苹果对多个系统框架及相关类库进行了改进.之前建立的项目在Xcode 5中重新编译会产生一些新问题. JosnKit是常用的轻量级Josn解析类,在Xcode 5中: BOOL work ...
- 高并发环境下,Redisson实现redis分布式锁
原文:http://tlzl0526-gmail-com.iteye.com/blog/2378853 在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好, ...
- 轻量级的REST中间件
轻量级的REST中间件 纯净的REST中间件,绝对的轻量级,不需要安装任何三方控件 基于HTTPS.SYS和WEBSOCKET通信,支持海量并发 支持跨越DELPHI6~DELPHI10.2.2的开发 ...
- AS3.0纯代码编写的两款loading效果
AS3.0纯代码编写的两款loading效果 效果一 效果二 代码很简单,实现的原理一样,只不过矩形用到了Matrix类,对注册点进行了调整,效果可用于视频播放器缓冲时的loading效果,下面看代码 ...
- Android 卡顿优化 2 渲染优化
1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那 ...
- [Android自定义控件] Android Scroller工具类和GestureDetector的简单用法
转载:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View ...
- Linux下的基础命令
在容器环境中很多时候要确定底层操作系统是什么和什么版本,网上找了一把,发现了一些比较有用的命令,从其他地方转过来,参考 # uname -a # 查看内核/操作系统/CPU信息 # head -n / ...
- 七.使用fastJson解析器
1.到入jar包 <!-- 添加fastjson 依赖包. --> <dependency> <groupId>com.alibaba</groupId> ...
- HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs
题意: 1.找一个字符串s使得 s不是给定母串的子串 2.且s要最短 3.s在最短情况下字典序最小 hash.,,结果t掉了...加了个姿势怪异的hash值剪枝才过.. #include <cs ...
- ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-NamedAndOptional(命名和可选参数) 1.A,示例(Sample) 返回顶 ...