建造者模式的应用之Xml和Txt生成器

标签: DesignPattern(程序设计的指导思想)
13人阅读 评论(0) 收藏 举报
分类:
Builder模式的使用场合

(1)相同的方法,不同的执行顺序,产生不同的事件结构时,可以采用建造者模式。

(2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个可以使用该模式。

【编程实验】将数据导出为txt和xml格式的文件

  ①文件头:包括部门ID、导出数据的日期

  ②文件体:表名称、分条描述数据

  ③文件尾:输出人的信息

//声明文件

//*********************************************************************************
//创建型模式:建造者模式
//将数据导出为不同格式的文件
#include <iostream>
#include <string>
#include <sstream>
#include <list>

using namespace std;
//*************************辅助类:各个部件************************
//文件头对象
class CFileHeader{
private:
	string strDeptNo;//部门编号
	string strExpDate; //导出数据的日期
public:
	void SetDeptNo(string dept);
	string GetDeptNo();
	void SetExpDate(string date);
	string GetExpDate();
};
//文件体
class CFileBody{
private:
	string strProduct; //产品编号
	double dPrice; //销售价格
	long lAmount;//销售数量
public:
	void SetProduct(string product);
	string GetProduct();
	void SetPrice(double price);
	double GetPrice();
	void SetAmount(long amount);
	long GetAmount();
};
//文件尾
class CFileFooter{
private:
	string strUser;//输出人
public:
	void SetUser(string user);
	string GetUser();
};
//*******************************Builder*************************
class CFileBuilder{
public:
	virtual void BuildHeader(CFileHeader& header) = 0;
	virtual void BuildBody(list<CFileBody>& bodys) = 0;
	virtual void BuildFooter(CFileFooter& footer) = 0;
	virtual string& Output() = 0;
};
//XmlBuilder
class CXmlBuilder : public CFileBuilder{
private:
	string strBuff;//用来记录文件的内容,相当于最终产品
public:
	void BuildHeader(CFileHeader& header);
	void BuildBody(list<CFileBody>& bodys);
	void BuildFooter(CFileFooter& footer);
	string& Output();
};

//TxtBuilder
class CTxtBuilder : public CFileBuilder{
private:
	string strBuff;//用来记录文件的内容,相当于最终产品
public:
	void BuildHeader(CFileHeader& header);
	void BuildBody(list<CFileBody>& bodys);
	void BuildFooter(CFileFooter& footer);
	string& Output();
};
//*********************************Director*********************
class CFileDirector{
private:
	CFileBuilder* pBuilder;
public:
	CFileDirector();
	CFileDirector(CFileBuilder* builder);
	void SelectBuilder(CFileBuilder* builder);
	void Construct(CFileHeader& header, list<CFileBody>& bodys, CFileFooter& footer);
};

//实现文件

//*********************************************************************************
//创建型模式:建造者模式
//将数据导出为不同格式的文件
//*************************辅助类:各个部件************************
//文件头对象
void CFileHeader::SetDeptNo(string dept){strDeptNo = dept;}
string CFileHeader::GetDeptNo(){return strDeptNo;}
void CFileHeader::SetExpDate(string date){strExpDate = date;}
string CFileHeader::GetExpDate(){return strExpDate;}
//文件体
void CFileBody::SetProduct(string product){strProduct = product;}
string CFileBody::GetProduct(){return strProduct;}
void CFileBody::SetPrice(double price){dPrice = price;}
double CFileBody::GetPrice(){return dPrice;}
void CFileBody::SetAmount(long amount){lAmount = amount;}
long CFileBody::GetAmount(){return lAmount;}
//文件尾
void CFileFooter::SetUser(string user){strUser = user;}
string CFileFooter::GetUser(){return strUser;}
//*******************************Builder*************************
//XmlBuilder
void CXmlBuilder::BuildHeader(CFileHeader& header)
{
	strBuff.append("<?xml version = '1.0' encoding = 'gb2313'?>\n");
	strBuff.append("<Report>\n");
	strBuff.append("	<Header>\n");
	strBuff.append("		<DeptNo>" + header.GetDeptNo() + "</DeptNo>\n");
	strBuff.append("		<ExpDate>" + header.GetExpDate() + "</ExpDate>\n");
	strBuff.append("	</Header>\n");
}
void CXmlBuilder::BuildBody(list<CFileBody>& bodys)
{
	strBuff.append("	<Body>\n");
	strBuff.append("		<Datas TableName = Sale Details:>\n");
	ostringstream oss;
	for(list<CFileBody>::iterator it = bodys.begin(); it != bodys.end(); it++){// list<Body>::iterator
		oss.str(""); oss << it->GetPrice();
		strBuff.append("			<Data>\n");
		strBuff.append("				<ProductId>" + it->GetProduct() + "</ProductId>\n");
		strBuff.append("				<Price>" + oss.str() + "</Price>\n");
		oss.str(""); oss << it->GetAmount();
		strBuff.append("				<Amount>" + oss.str() + "</Amount>\n");
		strBuff.append("			<\Data>\n");
	}
	strBuff.append("		<\Datas\n");
	strBuff.append("	<\Body>\n");
}
void CXmlBuilder::BuildFooter(CFileFooter& footer)
{
	strBuff.append("	<Footer>\n");
	strBuff.append("		<ExpUser>" + footer.GetUser() + "<\ExpUser>\n");
	strBuff.append("	</Footer>\n");
	strBuff.append("</Report>\n");
}
string& CXmlBuilder::Output(){return strBuff;}

//TxtBuilder
void CTxtBuilder::BuildHeader(CFileHeader& header)
{
	strBuff.append(header.GetDeptNo() + ", " + header.GetDeptNo());
}
void CTxtBuilder::BuildBody(list<CFileBody>& bodys)
{
	strBuff.append("Sale details:\n");
	ostringstream oss;
	for(list<CFileBody>::iterator it = bodys.begin(); it != bodys.end(); it++){
		strBuff.append("ProductId=" + it->GetProduct() + ", ");
		oss.str(""); oss << it->GetPrice();
		strBuff.append("Price=" + oss.str() + ", ");
		oss.str(""); oss << it->GetAmount();
		strBuff.append("Amount=" + oss.str() +". \n");
	}
}
void CTxtBuilder::BuildFooter(CFileFooter& footer)
{
	strBuff.append(footer.GetUser() + "\n");
}
string& CTxtBuilder::Output(){return strBuff;}
//*********************************Director*********************
CFileDirector::CFileDirector() : pBuilder(NULL){}
CFileDirector::CFileDirector(CFileBuilder* builder) : pBuilder(builder){}
void CFileDirector::SelectBuilder(CFileBuilder* builder) { pBuilder = builder;}
void CFileDirector::Construct(CFileHeader& header, list<CFileBody>& bodys, CFileFooter& footer)
{
	pBuilder->BuildHeader(header);
	pBuilder->BuildBody(bodys);
	pBuilder->BuildFooter(footer);
}

//测试客户端

void main()
{
	CFileHeader header; header.SetDeptNo("Kanq"); header.SetExpDate("2018-03-21");
	list<CFileBody> bodys;
	CFileBody Body1; Body1.SetProduct("001"); Body1.SetPrice(99); Body1.SetAmount(99); bodys.push_back(Body1);
	CFileBody Body2; Body2.SetProduct("002"); Body2.SetPrice(55); Body2.SetAmount(49); bodys.push_back(Body2);
	CFileFooter footer; footer.SetUser("YuLiangyong");

	//创建指导者对象
	CFileDirector* pFileDirector = new CFileDirector();

	CFileBuilder* pTxtBuilder = new CTxtBuilder(); //测试输出到文本文件
	CFileBuilder* pXmlBuilder = new CXmlBuilder(); //测试输出到XML文件

	pFileDirector->SelectBuilder(pTxtBuilder);
	pFileDirector->Construct(header, bodys, footer);
	cout << pTxtBuilder->Output() << endl;

	pFileDirector->SelectBuilder(pXmlBuilder);
	pFileDirector->Construct(header, bodys, footer);
	cout << pXmlBuilder->Output() << endl;

	delete pTxtBuilder;
	delete pXmlBuilder;
	delete pFileDirector;
}

查看评论

HTML5+CSS3+jquery应用之美

  • 2017年11月15日 10:35
  • 72.94MB
  • 下载

应用achartengine包画数据统计图之二————画PieChart(饼图)

本文继续上文(http://www.cnblogs.com/water-drop/archive/2012/11/01/2750379.html)的思路,画另一种常用图形——饼图(PieChart) ...
  • mylovepwy
  • mylovepwy
  • 2016-10-19 10:24:39
  • 410

栈在表达式求值中的应用

首先我们使用java来实现栈ADT,这里不使用java提供的Stack类, 而是使用ArrayList来实现,具体看代码:public class MyStack { public ArrayL...
  • zxc123e
  • zxc123e
  • 2015-08-13 17:54:53
  • 694

栈的应用之进制转化

顺序栈的代码: 不再赘述:点击打开链接 //栈的应用-----进制转化 #include"stack.h" int main() { Stack st; InitStack(&s...
  • ZongYinHu
  • ZongYinHu
  • 2015-05-09 16:10:07
  • 635

Android应用之更换头像

先来看一下运行图: 下面看一下具体的代码: MainActivity.java package cn.bzu.dialog_imageswitcher; import androi...
  • myMint
  • myMint
  • 2012-12-20 10:50:45
  • 697

客户与服务应用之取回客户IP

  • 2011年09月08日 11:06
  • 17KB
  • 下载

shell 典型应用之主控脚本实现

一、设置方式分类 方式一、临时性质的设置 关闭高亮 方式二、永久性质的设置(修改vimrc文件) 可以在任意目录下修改设置 如 cd /home/abc/.vimrc二、常用设置...
  • Mayday920723
  • Mayday920723
  • 2017-03-07 16:00:41
  • 232

网站的海量数据和高并发的解决方案(二)

高并发的解决方案除了数据量大,另外一个常见的问题就是并发量高,很多架构就是针对这个问题设计出来的。1.应用和静态资源分离刚开始的时候应用和静态资源是保存在一起的,当并发量达到一定程度的时候就需要将静态...
  • u012373815
  • u012373815
  • 2017-05-08 21:27:50
  • 1155

Shell脚本典型应用

一 脚本场景     二 实现脚本 1、主控脚本实现 2、系统信息及系统状态分析 3、nginx和mysql应用状态分析 4、应用日志分析   三 场景脚本演示 [root@lo...
  • chengqiuming
  • chengqiuming
  • 2017-11-22 12:17:03
  • 30

STM32的SPI应用之LCD.pdf

  • 2010年03月19日 21:56
  • 169KB
  • 下载
    个人资料
    等级:
    访问量: 1344
    积分: 790
    排名: 6万+
    文章存档