c++改写李维面向对象实践指南
以前出过李维老师的一本书,<<面向对象实践指南c#版>>,我先后使用c++,java语言改写了一遍,这里列出c++改写的主要的类:
======================================================================
TPFMTask:
class TPFMTask{
protected:
TPFMSchedule *pFSchedule;
TPFMConfig *pFConfig;
vector<void *> FHandlers;
virtual vector<void *> CreateHandlersFromConfig(TPFMConfig aConfig);
void ApplyHandlersToTargets(TPFMConfig aConfig, vector<void *> _FHandlers);
void BroadCastHandlers(TCandidate aCandidate,vector<void *> _FHandlers);
public:
TPFMTask();
virtual bool Execute(TPFMSchedule aSchedule, TPFMConfig aConfig);
};
#include "TPFMTask.h"
TPFMTask::TPFMTask()
{
pFSchedule=NULL;
pFConfig=NULL;
FHandlers.clear();
}
/*虚函数:动态绑定*/
vector<void *> TPFMTask::CreateHandlersFromConfig(TPFMConfig aConfig)
{
vector<void *> handlerList;
handlerList.clear();
/*这是最简单的一种,可能会有多个<handler>的子标签*/
TPFMHandler *pTPFMHandler=TPFMHandlerFactory::GetTPFMHandler(aConfig.GetHandler());
handlerList.push_back(pTPFMHandler);
pTPFMHandler=TPFMHandlerFactory::GetTPFMHandler(aConfig.GetDestination());
handlerList.push_back(pTPFMHandler);
return handlerList;
}
void TPFMTask::BroadCastHandlers(TCandidate aCandidate,vector<void *> _FHandlers)
{
vector<byte> baTarget;
baTarget.clear();
vector<void *>::iterator iter=_FHandlers.begin();
while(iter!=_FHandlers.end()){
TPFMHandler *pTPFMHandler=(TPFMHandler*)(*iter);
pTPFMHandler->Perform(aCandidate,baTarget);
}
}
void TPFMTask::ApplyHandlersToTargets(TPFMConfig aConfig, vector<void *> _FHandlers)
{
//应该使用TFinder,但这里做了简化
TFileFinder *pFileFinder=NULL;
pFileFinder=new TFileFinder(aConfig);
TFileFinderEnumerator *pFileFinderEnumerator=pFileFinder->GetEnumerator();
while(pFileFinderEnumerator->MoveNext()){
TCandidate candidateTmp=pFileFinderEnumerator->Current();
BroadCastHandlers(candidateTmp,_FHandlers);
}
delete pFileFinderEnumerator;
delete pFileFinder;
}
/*虚函数:动态绑定*/
bool TPFMTask::Execute(TPFMSchedule aSchedule, TPFMConfig aConfig)
{
if (FHandlers.size()>0){
FHandlers.clear();
}
if (aSchedule.GetExt()!=""){
pFSchedule=&aSchedule;
}
pFConfig=&aConfig;
return true;
}
=======================================================================
TPFMManager:
class TPFMManager
{
private:
TPFMConfigManager *pTPFMConfigManager;
TPFMScheduleManager *pTPFMScheduleManager;
void CreateProcessors();
int GetConfigCount();
int GetScheduleCount();
protected:
XMLNode rootNode;
string configurationFile;
string scheduleFile;
virtual bool ProcessConfiguration();
void CreateXmlNode(string sXMLFile);
void LoadPFMFile(string sFileName);
public:
vector<TPFMManager *> processorList;
int configNodeSeq;
int scheduleNodeSeq;
void RegisterProcessor(TPFMManager *pTPFMManager,TPFMManager *pTPFMManagerOther);
bool ProcessConfigurations();
int ConfigCount();
int ScheduleCount();
TPFMConfig getConfig(int index);
TPFMSchedule getSchedule(int index);
virtual void * GetNextInstance(){return NULL;};
bool Perform(TPFMManager *pCaller, string sFileName, vector<void *> &collector);
TPFMManager(){};
TPFMManager(string sConfigFile, string sScheduleFile);
TPFMConfig GetConfigFromSchedule(TPFMSchedule aSchedule);
vector<void *> FindScheduledObjects(string dt);
};
class TPFMConfigManager: public TPFMManager
{
private:
vector<void *> configs;
TPFMConfig GetItem(int index);
int GetConfigCount();
TPFMConfig *GetNextConfig();
TPFMManager *pBaseTPFMManager;
protected:
bool ProcessConfiguration();
public:
TPFMConfigManager(string _configFile,TPFMManager *pTPFMManager);
TPFMConfig operator[](int index);
int Count();
void * GetNextInstance();
vector<void *> GetConfigs();
};
class TPFMScheduleManager: TPFMManager
{
private:
vector<void *> schedules;
TPFMSchedule GetItem(int index);
int GetScheduleCount();
TPFMSchedule *GetNextSchedule();
TPFMManager *pBaseTPFMManager;
protected:
bool ProcessConfiguration();
public:
TPFMScheduleManager(string _scheduleFile,TPFMManager *pTPFMManager);
TPFMSchedule operator[](int index);
int Count();
void * GetNextInstance();
vector<void *> GetSchedules();
};
#include "TPFMManager.h"
TPFMManager::TPFMManager(string sConfigFile, string sScheduleFile)
{
if (sConfigFile != "")
configurationFile= sConfigFile;
if (sScheduleFile != "")
scheduleFile= sScheduleFile;
}
void TPFMManager::CreateProcessors()
{
if (pTPFMConfigManager==NULL){
pTPFMConfigManager= new TPFMConfigManager(configurationFile,this);
}
if (pTPFMScheduleManager==NULL){
pTPFMScheduleManager= new TPFMScheduleManager(scheduleFile,this);
}
}
bool TPFMManager::ProcessConfigurations()
{
pTPFMConfigManager=NULL;
pTPFMScheduleManager=NULL;
CreateProcessors();
return ProcessConfiguration();
}
int TPFMManager::GetConfigCount()
{
return pTPFMConfigManager->Count();
}
int TPFMManager::GetScheduleCount()
{
return pTPFMScheduleManager->Count();
}
int TPFMManager::ScheduleCount()
{
return GetScheduleCount();
}
bool TPFMManager::ProcessConfiguration()
{
bool bResult = false;
vector<TPFMManager *>::iterator iter=processorList.begin();
while(iter!=processorList.end()){
TPFMManager *pManager=*iter;
bResult = (pManager->ProcessConfiguration())|| bResult;
iter++;
}
return bResult;
}
void TPFMManager::RegisterProcessor(TPFMManager *pTPFMManager,TPFMManager *pTPFMManagerOther)
{
if (count(pTPFMManagerOther->processorList.begin(),pTPFMManagerOther->processorList.end(),pTPFMManager)==0){
pTPFMManagerOther->processorList.push_back(pTPFMManager);
}
}
void TPFMManager::CreateXmlNode(string sXMLFile)
{
string lineBuf="",xmlBuf="";
ifstream initFile(sXMLFile.c_str(),ios::in );
bool fitstLine=true;
while (getline(initFile,lineBuf,'/n')) {
if (fitstLine==true){
fitstLine=false;
continue;
}
xmlBuf.append(trim(lineBuf));
}
rootNode = XMLNode::parseString((const char*)xmlBuf.c_str(),"Targets");
if (rootNode.isEmpty()){
rootNode = XMLNode::parseString((const char*)xmlBuf.c_str(),"Schedules");
}
}
void TPFMManager::LoadPFMFile(string sFileName)
{
CreateXmlNode(sFileName);
}
int TPFMManager::ConfigCount()
{
return GetConfigCount();
}
TPFMConfig TPFMManager::getConfig(int index)
{
return (*pTPFMConfigManager)[index];
}
TPFMSchedule TPFMManager::getSchedule(int index)
{
return (*pTPFMScheduleManager)[index];
}
bool TPFMManager::Perform(TPFMManager *pCaller, string sFileName, vector<void *> &collector)
{
LoadPFMFile(sFileName);
collector.clear();
while (true){
void *p=pCaller->GetNextInstance();
if (p!=NULL){
collector.push_back(p);
}else{
break;
}
}
return true;
}
TPFMConfig TPFMManager::GetConfigFromSchedule(TPFMSchedule aSchedule)
{
vector<void *> vecConfigs=pTPFMConfigManager->GetConfigs();
vector<void *>::iterator iter=vecConfigs.begin();
while(iter!=vecConfigs.end()){
TPFMConfig *pTPFMConfig=(TPFMConfig *)*iter;
if (pTPFMConfig->GetExt()==aSchedule.GetExt()){
return *pTPFMConfig;
}
iter++;
}
}
TPFMConfig TPFMConfigManager::GetItem(int index)
{
if (index<GetConfigCount()){
return *((TPFMConfig *)configs[index]);
}
}
vector<void *> TPFMConfigManager::GetConfigs()
{
return configs;
}
int TPFMConfigManager::GetConfigCount()
{
return configs.size();
}
TPFMConfig * TPFMConfigManager::GetNextConfig()
{
string ext = "";
string location = "";
string subDirectory = "";
string unit = "";
string remove = "";
string handler = "";
string destination = "";
string dir = "";
string connectionSting = "";
XMLNode typeXMLNode=rootNode.getChildNode(pBaseTPFMManager->configNodeSeq);
if (!typeXMLNode.isEmpty()){
XMLNode tempNode=typeXMLNode.getChildNode("EXT");
if (tempNode.getText()!=NULL){
ext=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("LOCATION");
if (tempNode.getText()!=NULL){
location=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("SUBDIRECTORY");
if (tempNode.getText()!=NULL){
subDirectory=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("UNIT");
if (tempNode.getText()!=NULL){
unit=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("REMOVE");
if (tempNode.getText()!=NULL){
remove=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("HANDLER");
if (tempNode.getText()!=NULL){
handler=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("DESTINATION");
if (tempNode.getText()!=NULL){
destination=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("DIR");
if (tempNode.getText()!=NULL){
dir=string(tempNode.getText());
}
tempNode=typeXMLNode.getChildNode("CONNECTIONSTRING");
if (tempNode.getText()!=NULL){
connectionSting=string(tempNode.getText());
}
TPFMConfig *pTPFMConfig=new TPFMConfig(ext,location,subDirectory,unit,remove,
handler,destination,dir,connectionSting);
pBaseTPFMManager->configNodeSeq++;
return pTPFMConfig;
}else{
return NULL;
}
}
bool TPFMConfigManager::ProcessConfiguration()
{
return Perform(this, configurationFile, configs);
}
TPFMConfig TPFMConfigManager::operator[](int index)
{
return GetItem(index);
}
TPFMConfigManager::TPFMConfigManager(string _configFile,TPFMManager *pTPFMManager)
{
if (_configFile!= ""){
configurationFile =_configFile;
}
configs.clear();
pBaseTPFMManager=pTPFMManager;
pBaseTPFMManager->configNodeSeq=0;
RegisterProcessor(this,pBaseTPFMManager);
}
int TPFMConfigManager::Count()
{
return GetConfigCount();
}
void * TPFMConfigManager::GetNextInstance()
{
return GetNextConfig();
}
TPFMSchedule TPFMScheduleManager::GetItem(int index)
{
if (index<GetScheduleCount()){
return *((TPFMSchedule *)schedules[index]);
}
}
vector<void *> TPFMScheduleManager::GetSchedules()
{
return schedules;
}
int TPFMScheduleManager::GetScheduleCount()
{
return schedules.size();
}
TPFMSchedule * TPFMScheduleManager::GetNextSchedule()
{
string ext = "";
string time="";
string interval="";
XMLNode schedulesXMLNode=rootNode.getChildNode(pBaseTPFMManager->scheduleNodeSeq);
if (!schedulesXMLNode.isEmpty()){
XMLNode tempNode=schedulesXMLNode.getChildNode("Ext");
if (tempNode.getText()!=NULL){
ext=string(tempNode.getText());
}
tempNode=schedulesXMLNode.getChildNode("Time");
if (tempNode.getText()!=NULL){
time=string(tempNode.getText());
}
tempNode=schedulesXMLNode.getChildNode("Interval");
if (tempNode.getText()!=NULL){
interval=string(tempNode.getText());
}
TPFMSchedule *pTPFMSchedule=new TPFMSchedule(ext,time,interval);
pBaseTPFMManager->scheduleNodeSeq++;
return pTPFMSchedule;
}else{
return NULL;
}
}
bool TPFMScheduleManager::ProcessConfiguration()
{
return Perform(this, scheduleFile,schedules);
}
TPFMSchedule TPFMScheduleManager::operator[](int index)
{
return GetItem(index);
}
TPFMScheduleManager::TPFMScheduleManager(string _scheduleFile,TPFMManager *pTPFMManager)
{
if (_scheduleFile!= ""){
scheduleFile =_scheduleFile;
}
schedules.clear();
pBaseTPFMManager=pTPFMManager;
pBaseTPFMManager->scheduleNodeSeq=0;
RegisterProcessor(this,pBaseTPFMManager);
}
int TPFMScheduleManager::Count()
{
return GetScheduleCount();
}
void * TPFMScheduleManager::GetNextInstance()
{
return GetNextSchedule();
}
vector<void *> TPFMManager::FindScheduledObjects(string dt)
{
vector<void *> scheduleList;
scheduleList.clear();
for (int i= 0;i<ScheduleCount();i++){
TPFMSchedule schedule=getSchedule(i);
/*没有判断时间间隔,简化为直接处理*/
scheduleList.push_back((TPFMSchedule*)(&schedule));
}
return scheduleList;
}
=======================================================================
TPFMHandlerFactory:
class TPFMHandlerFactory{
private:
static TPFMHandlerMap *handlerMap;
static TPFMHandler* RegisterHandler(string handlerName);
static Mutex handlerMapMutex;
public:
TPFMHandlerFactory(){};
static TPFMHandler * GetTPFMHandler(string handlerName);
static void DestoryHandler();
};
#include "TPFMHandlerFactory.h"
TPFMHandlerMap* TPFMHandlerFactory::handlerMap = NULL; //map初始化
Mutex TPFMHandlerFactory::handlerMapMutex;
TPFMHandler* TPFMHandlerFactory::RegisterHandler(string handlerName)
{
TPFMHandler *pHandler=NULL;
if (handlerName=="TPFMFileHandler"){
pHandler=new TPFMFileHandler();
}else if (handlerName=="TPFMZipHandler"){
pHandler=new TPFMZipHandler();
}else if (handlerName=="TPFMUnZipHandler"){
pHandler=new TPFMUnZipHandler();
}
(*handlerMap)[handlerName]=pHandler;
return pHandler;
}
TPFMHandler * TPFMHandlerFactory::GetTPFMHandler(string handlerName)
{
TPFMHandler *pHandler=NULL;
ScopedLock lock(handlerMapMutex);
if (handlerMap==NULL){
handlerMap=new map<string,TPFMHandler*>;
}
TPFMHandlerMap::iterator it=handlerMap->find(handlerName);
if (it==handlerMap->end()){
pHandler=RegisterHandler(handlerName);
return pHandler;
}else{
return (*handlerMap)[handlerName];
}
}
void TPFMHandlerFactory::DestoryHandler()
{
TPFMHandlerMap::iterator itDel=handlerMap->begin();
while(itDel!=handlerMap->end()){
delete itDel->second;
itDel++;
}
delete handlerMap;
}
==================================================================
TPFMCoordinator:
class TPFMCoordinator{
private:
TPFMManager *pFpfmManager;
TPFMTaskDispatcher *pTPFMTaskDispatcher;
void DoSetups();
public:
TPFMCoordinator(string dirOne,string dirTwo);
void DoSpecifiedTask(TPFMConfig aConfig);
void DoScheduledTask(string dt);
TPFMManager * GetTPFMManager();
};
#include "TPFMCoordinator.h"
TPFMCoordinator::TPFMCoordinator(string dirOne,string dirTwo)
{
pFpfmManager=NULL;
pFpfmManager=new TPFMManager(dirOne,dirTwo);
pTPFMTaskDispatcher=NULL;
pTPFMTaskDispatcher=new TPFMTaskDispatcher();
DoSetups();
}
void TPFMCoordinator::DoSetups()
{
pFpfmManager->ProcessConfigurations();
}
TPFMManager* TPFMCoordinator::GetTPFMManager()
{
return pFpfmManager;
}
void TPFMCoordinator::DoSpecifiedTask(TPFMConfig aConfig)
{
pTPFMTaskDispatcher->DoSpecifiedTask(*pFpfmManager,aConfig);
}
void TPFMCoordinator::DoScheduledTask(string dt)
{
vector<void *> scheduledList;
scheduledList.clear();
scheduledList=pFpfmManager->FindScheduledObjects(dt);
pTPFMTaskDispatcher->DoScheduledTask(*pFpfmManager,scheduledList);
}
==================================================================
TFileFinderEnumerator:
class TFileFinderEnumerator{
private:
int index;
TFileFinder *pFileFinder;
public:
TFileFinderEnumerator(TFileFinder *_pFileFinder);
bool MoveNext();
TCandidate GetCurrent();
TCandidate Current();
void Reset();
};
#include "TFileFinderEnumerator.h"
TFileFinderEnumerator::TFileFinderEnumerator(TFileFinder *_pFileFinder)
{
pFileFinder=_pFileFinder;
index=-1;
}
bool TFileFinderEnumerator::MoveNext()
{
bool bResult=index<pFileFinder->GetCount();
if (bResult==true){
index++;
}
return bResult;
}
TCandidate TFileFinderEnumerator::GetCurrent()
{
return (*pFileFinder)[index];
}
TCandidate TFileFinderEnumerator::Current()
{
return GetCurrent();
}
void TFileFinderEnumerator::Reset()
{
index=-1;
}
c++改写李维面向对象实践指南相关推荐
- 读《道法自然-面向对象实践指南》
读了几个段落,觉得这是一本很用心也写的很好的书,值得我好好看,也顺便把一些写得好的地方记录下来. 第四章 模式:变化之美VS永恒之道 p70:很多人讨厌需求的变化,他们一旦把设计或者编码做完,就求神拜 ...
- 阿里智能运维实践|阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>前往:https://developer.aliyun.com/topic/devops,下载完整版电子书,了解阿里十年 ...
- 《javascript面向对象编程指南》读书笔记
<javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...
- 阿里巴巴DevOps实践指南 | 为什么DevOps的必然趋势是BizDevOps?
简介:从精益思想出发,我们可以看到DevOps的必然发展方向,那就是向业务侧延伸.业务是产品开发和运维的源头,完整的价值流必须从源头开始.这不是预测,而是正在发生的事实 编者按:本文源自阿里云云效团队 ...
- 现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售
终于发售了,啥也不想说了,喜欢的或需要的就点击 链接 进去购买吧. 另外此书将作为 2017 PHP全球开发者大会 现场活动用书 天猫购书 包邮 PHP7实践指南:O2O网站与App后台开发 数据库设 ...
- 《App架构师实践指南》:移动开发的进阶指南
文章主要内容: 什么是 app 架构师 这本书主要内容 读完感受 什么是 App 架构师 成为"架构师"是许多程序员的梦想,当然也包括我,在工作的几年里,我见过很多架构师,他们在设 ...
- 深度学习「CV」学习实践指南!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄星源.樊亮.陈桦.斯国一 深度学习的发展不仅突破了许多视觉难题, ...
- 阿里巴巴DevOps实践指南 | 数字化转型下,DevOps的根本目标是什么?
简介:数字化转型是信息技术与产业的结合.需要转型的不仅仅是各个传统的产业,也包含信息产业本身,如互联网公司.DevOps 是数字化转型的重要组成部分,DevOps 的体系和实践也必须服务于数字化转型的 ...
- 重磅发布!阿里云云效《阿里巴巴DevOps实践指南》
简介:6月23日,在2021阿里巴巴研发效能峰会上,由阿里云云效团队20位专家共同撰写的<阿里巴巴DevOps实践指南>(以下简称指南)正式对外发布.本指南是阿里云云效团队对过去十年阿里巴 ...
最新文章
- python实现全景图片拼接
- 前牙正常覆盖是多少_个性化舌侧矫治器的前牙转矩控制技巧——赵志河教授
- 基于verilog流水灯设计
- 笔记整理——linux程序设计
- 微型计算机中的奔四指的是,2015云南省计算机等级考试二级理论考试试题及答案...
- GNU make manual 翻译( 一百五十五)
- Django中的视图(view)
- GDAL源码剖析(八)之编译GEOS和PROJ4库
- 单机按钮来图片轮播_原生js如何实现轮播图效果?
- Java语言中的泛型
- 半导体、芯片、集成电路、无尘车间具体释义及区别
- 软件设计师中级-数据库系统
- 信道、频段带宽等术语简介
- hihocoder 网易游戏2016实习生招聘在线笔试 解题报告
- win10电池图标不能调亮度_win10电池图标下面的亮度调节用不了
- 微信小程序Canvas画图片,合成图片,微信头像合成,变更国庆头像,头像增加背景
- PyQt5 与 PySide2 所有事件大集合,一段代码包括键盘、鼠标和窗口所有事件
- 感悟《疯狂的程序员》
- 解决RTL8723BE网卡Linux上WIFI信号信号差的问题
- 仿微信九宫格群聊view
热门文章
- parasoft Jtest 使用教程:生成、执行和扩展Junit测试用例
- android 修改系统权限 WRITE_SETTINGS
- java 正则 小数_java用正则表达式判断是否是小数的方法
- linux vncviewer使用教程,vnc viewer 远程桌面,11步实现vnc viewer 远程桌面连接Linux
- java计算机毕业设计影楼网站源码+数据库+系统+lw文档+部署
- 破坏入侵计算机信息系统犯罪,计算机信息系统破坏罪与计算机非法入侵罪区别...
- 4.6实践,路由器wds设置
- 95、基于51单片机智能闹钟万年历 农历阳历温度电子时钟闹钟定时语音播报系统
- airplay_AirPlay即将应用于智能电视。 这是如何运作的
- JavaScript流程控制