首页 > 其他分享 >设计模式-建造者模式

设计模式-建造者模式

时间:2023-02-19 14:23:00浏览次数:38  
标签:void 建造 模式 header strTmp ExportFooterModel iter 设计模式 append

业务场景

image

未使用建造者模式实现

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;


template<class T>
string ConvertToString(T value) {
	stringstream ss;
	ss << value;
	return ss.str();
}

class ExportHeaderModel {

public:
	ExportHeaderModel(string id, string date) :m_DepId(id), m_ExportDate(m_ExportDate) {
	
	};

	string getId() { return m_DepId; };
	string getDate() { return m_ExportDate; };


private:
	string m_DepId;
	string m_ExportDate;
};

class ExportDataModel {

public:
	ExportDataModel(string strTransId, double Quantity) :m_strTransID(strTransId), m_Quantity(Quantity) {};


	string getStrTransId() { return m_strTransID; };
	double getQuantity() { return m_Quantity; };


private:
	string m_strTransID;
	double m_Quantity;

};


class ExportFooterModel {

public:
	ExportFooterModel(string user):m_exportUser(user) {}
	string getExportUser() { return m_exportUser; };

private:
	string m_exportUser;
};



class ExportToTxtHelper {

public:

	void doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm);
};

void ExportToTxtHelper::doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm) {

	//
	string strTmp = "";
	//1.文件头
	strTmp += header.getId() + "," + header.getDate() + "\n";
	
	
	//2.文件体
	auto iter = edmCollection.begin();
	for ( ; iter != edmCollection.end() ; iter++)
	{
		strTmp += (*iter)->getStrTransId() + ":" + ConvertToString((*iter)->getQuantity()) + "\n";
		
	}

	//3.文件尾
	strTmp += efm.getExportUser() + "\n";

	printf("******\n");
	printf("%s", strTmp.c_str());
	printf("******\n");
}



class ExportToXmlHelper {

public:

	void doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm);
};



void ExportToXmlHelper::doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm) {

	string strTmp = "";
	strTmp.append("<?xml version='1.0' encoding='utf-8'>\n");
	strTmp.append("<Root>\n");
	strTmp.append("    <header>\n");
	strTmp.append("           <DepId>\n");
	strTmp.append(header.getId() + "</DepId>\n");
	strTmp.append("           <Date>\n");
	strTmp.append(header.getDate() + "</Date>\n");
	strTmp.append("    </header>\n");
	/*后面省略*/

	printf("%s", strTmp.c_str());

}

int main(void) {

	ExportHeaderModel* header = new ExportHeaderModel("NanJing", "6月1号");
	auto data1 = new ExportDataModel("1", 1000.00f);
	auto data2 = new ExportDataModel("2", 2000.00f);
	vector<ExportDataModel*> mVec;
	mVec.push_back(data1);
	mVec.push_back(data2);

	ExportFooterModel* footer = new ExportFooterModel("ZJ");

	//ExportToTxtHelper helper;
	ExportToXmlHelper helper;
	helper.doExport(*header, mVec, *footer);

	delete header;
	delete data1;
	delete data2;
	delete footer;

}



使用建造者模式

#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;


template<class T>
string ConvertToString(T value) {
	stringstream ss;
	ss << value;
	return ss.str();
}

class ExportHeaderModel {

public:
	ExportHeaderModel(string id, string date) :m_DepId(id), m_ExportDate(m_ExportDate) {

	};

	string getId() { return m_DepId; };
	string getDate() { return m_ExportDate; };


private:
	string m_DepId;
	string m_ExportDate;
};

class ExportDataModel {

public:
	ExportDataModel(string strTransId, double Quantity) :m_strTransID(strTransId), m_Quantity(Quantity) {};


	string getStrTransId() { return m_strTransID; };
	double getQuantity() { return m_Quantity; };


private:
	string m_strTransID;
	double m_Quantity;

};


class ExportFooterModel {

public:
	ExportFooterModel(string user) :m_exportUser(user) {}
	string getExportUser() { return m_exportUser; };

private:
	string m_exportUser;
};


/*
class ExportToTxtHelper {

public:

	void doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm);
};

void ExportToTxtHelper::doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm) {

	//
	string strTmp = "";
	//1.文件头
	strTmp += header.getId() + "," + header.getDate() + "\n";


	//2.文件体
	auto iter = edmCollection.begin();
	for (; iter != edmCollection.end(); iter++)
	{
		strTmp += (*iter)->getStrTransId() + ":" + ConvertToString((*iter)->getQuantity()) + "\n";

	}

	//3.文件尾
	strTmp += efm.getExportUser() + "\n";

	printf("******\n");
	printf("%s", strTmp.c_str());
	printf("******\n");
}


*/
/*
class ExportToXmlHelper {

public:

	void doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm);
};



void ExportToXmlHelper::doExport(ExportHeaderModel& header, vector<ExportDataModel*>& edmCollection, ExportFooterModel& efm) {

	string strTmp = "";
	strTmp.append("<?xml version='1.0' encoding='utf-8'>\n");
	strTmp.append("<Root>\n");
	strTmp.append("    <header>\n");
	strTmp.append("           <DepId>\n");
	strTmp.append(header.getId() + "</DepId>\n");
	strTmp.append("           <Date>\n");
	strTmp.append(header.getDate() + "</Date>\n");
	strTmp.append("    </header>\n");
	
	printf("%s", strTmp.c_str());

}
*/

class Builder {


public:
	virtual void builderHeader(ExportHeaderModel header) = 0;
	virtual void builderBody(vector<ExportDataModel*>& data) = 0;
	virtual void builderFoot(ExportFooterModel& footer)=0;
	virtual string getResult() { return strTmp; };
protected:
	Builder() { strTmp = ""; };

	string strTmp;
};


class TxtBuiler : public Builder {


public:

	virtual void builderHeader(ExportHeaderModel header) {

		strTmp += header.getId() + "," + header.getDate() + "\n";
	}
	
	virtual void builderBody(vector<ExportDataModel*>& data) {
		auto iter = data.begin();
		for (; iter != data.end(); iter++)
		{
			strTmp += (*iter)->getStrTransId() + ":" + ConvertToString((*iter)->getQuantity()) + "\n";

		}
	}

	virtual void builderFoot(ExportFooterModel& footer) {
		strTmp += footer.getExportUser() + "\n";
	}
	
};


class Director {

public:
	Director(Builder* builder) : m_builder(builder){};
	
	void builder(ExportHeaderModel& header, vector<ExportDataModel*>& data, ExportFooterModel& footer) {

		m_builder->builderHeader(header);
		m_builder->builderBody(data);
		m_builder->builderFoot(footer);
	}
private:
	Builder* m_builder;
};


int main(void) {


	ExportHeaderModel* header = new ExportHeaderModel("NanJing", "6月1号");
	auto data1 = new ExportDataModel("1", 1000.00f);
	auto data2 = new ExportDataModel("2", 2000.00f);
	vector<ExportDataModel*> mVec;
	mVec.push_back(data1);
	mVec.push_back(data2);

	ExportFooterModel* footer = new ExportFooterModel("ZJ");

	//ExportToTxtHelper helper;
	TxtBuiler builder;
	Director director(&builder);
	director.builder(*header, mVec, *footer);
	cout << (&builder)->getResult();
	
	delete header;
	delete data1;
	delete data2;
	delete footer;

}

标签:void,建造,模式,header,strTmp,ExportFooterModel,iter,设计模式,append
From: https://www.cnblogs.com/xcodingfork/p/17134694.html

相关文章

  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • 软件测试|测试开发之路--UI 自动化常用设计模式
    接上一次的帖子,今天讲一下我再UI自动化中常用的设计模式。由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了。就是讲我也讲不出什......
  • php 运用设计模式:观察者模式,设计电商平台支付成功程序|Github仓库
    前(fei)言(hua)在支付程序中,大型项目的维护,如果没有运用到设计模式,面向过程的编程,order程序会日益增加,程序看上去杂乱无章,今天写了一个小demo,之前没有运用过观察者模式的小伙......
  • 访问者模式
    解耦数据结构和数据三种角色访问者IPeople:对数据结构的访问被访问者IMoney:被访问的数据结构容器BankContainer:用于装载数据结构,提供方法接受访问者访问所有的数据结......
  • Python实现单例模式
    Python实现单例模式有两种方法:一种是通过静态变量方法实现单例模式;另一种是通过装饰器实现单例模式。具体实现代码如下:#方法一:静态变量方法实现单例模式。#1.构造方法私有......
  • 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新
    写在前面关于Playwright系列的文章,真的很久没有写了,今天一个不小心官方API部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习。API部分多线程直白点说就是......
  • 嵌入式ARM设计编程(三) 处理器工作模式
    文章和代码已归档至【Github仓库:​​hardware-tutorial​​】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复嵌入式也可获取。一、实验目的(1)通过实验掌握学会使用m......
  • ZMQ之脱机可靠性--巨人模式
      当你意识到管家模式是一种非常可靠的消息代理时,你可能会想要使用磁盘做一下消息中转,从而进一步提升可靠性。这种方式虽然在很多企业级消息系统中应用,但我还是有些反对的......
  • WPF中MVVM模式下loaded无法触发问题
    经过实践检测,当时View上设置了Window.SizeToContent="WidthAndHeight"时候<i:Interaction.Triggers><i:EventTriggerEventName="Loaded"><i:Invoke......
  • macOS Ventura13 的专注模式,帮你轻松专注当下
    无论你在工作、休闲,还是准备与家人共度美好时光,macOSVentura的专注模式过滤条件都能帮你轻松专注当下,让各种App根据你启用的专注模式定制你看到的内容和获取的通知。
......