首页 > 其他分享 >builder模式

builder模式

时间:2023-05-18 11:14:06浏览次数:39  
标签:edmCollection void iter strResulst 模式 builder append pBuilder

 

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <sstream>
  5 using namespace std;
  6 
  7 template<class T>
  8 string ConvertToString(T value) {
  9     stringstream ss;
 10     ss << value;
 11     return ss.str();
 12 }
 13 
 14 class ExportHeaderModel {
 15 public:
 16     ExportHeaderModel(string strDepId, string strExportDate) : m_strDepId(strDepId), m_strExportDate(strExportDate) {
 17 
 18     }
 19     string getDepId() {
 20         return m_strDepId;
 21     }
 22     string getExportDate() {
 23         return m_strExportDate;
 24     }
 25 private:
 26     string m_strDepId;//对账单的部门id
 27     string m_strExportDate;//对账单的导出日期
 28 };
 29 
 30 
 31 class ExportDataModel {
 32 public:
 33     ExportDataModel(string strTransId, double Quantity) : m_strTransId(strTransId), m_Quantity(Quantity) {
 34 
 35     }
 36     string getTransId() {
 37         return m_strTransId;
 38     }
 39     double getQuantity() {
 40         return m_Quantity;
 41     }
 42 private:
 43     string m_strTransId;//交易Id
 44     double m_Quantity;
 45 };
 46 
 47 class ExportFooterModel {
 48 public:
 49     ExportFooterModel(string exportUser) : m_exportUser(exportUser) {}
 50     string getExportUser() {
 51         return m_exportUser;
 52     }
 53 private:
 54     string m_exportUser;
 55 };
 56 class Builder {
 57 public:
 58     virtual void builderHeader(ExportHeaderModel& ehm)=0;
 59     virtual void builderBody(vector < ExportDataModel*>& edmCollection) = 0;
 60     virtual void builderFoot(ExportFooterModel& efm) = 0;
 61     virtual string getResult() = 0;
 62 protected:
 63     Builder(){}
 64 };
 65 
 66 class TxtBuilder : public Builder {
 67 public:
 68 
 69     void builderHeader(ExportHeaderModel& ehm) {
 70         m_strResulst.append(ehm.getDepId() + "," + ehm.getExportDate() + "\n");
 71     }
 72     void builderBody(vector < ExportDataModel*>& edmCollection) {
 73         for (vector<ExportDataModel*>::iterator iter = edmCollection.begin();iter != edmCollection.end();iter++) {
 74             m_strResulst += (*iter)->getTransId() + ":" + ConvertToString((*iter)->getQuantity()) + "\n";
 75             }
 76     }
 77     void builderFoot(ExportFooterModel& efm) {
 78         m_strResulst += efm.getExportUser() + "\n";
 79     }
 80 
 81     string getResult() {
 82         return m_strResulst;
 83     }
 84 public:
 85     TxtBuilder() {
 86         m_strResulst = "";
 87     }
 88 private:
 89     string m_strResulst;
 90 };
 91 
 92 
 93 class XmlBuilder : public Builder {
 94 public:
 95 
 96     void builderHeader(ExportHeaderModel& ehm) {
 97         m_strResulst.append("<?xml version='1.0' encoding='utf-8'>\n");
 98         m_strResulst.append("<Receipt>\n");
 99         m_strResulst.append("    <Header>\n");
100         m_strResulst.append("        <DepId>");
101         m_strResulst.append(ehm.getDepId() + "</DepId>\n");
102         m_strResulst.append("        <ExportDate>" + ehm.getExportDate() + "</ExportDate>\n");
103         m_strResulst.append("    </Header>\n");
104     }
105     void builderBody(vector < ExportDataModel*>& edmCollection) {
106         m_strResulst.append("    <Body>\n");
107             for (vector<ExportDataModel*>::iterator iter = edmCollection.begin();iter != edmCollection.end();iter++) {
108         m_strResulst.append("        <id>" + (*iter)->getTransId() + "</id>\n");
109         m_strResulst.append("        <amount>" + ConvertToString((*iter)->getQuantity()) + "</amount>\n");
110             }
111             m_strResulst.append("    </Body>\n");
112     }
113     void builderFoot(ExportFooterModel& efm) {
114         m_strResulst.append("    <Footer>\n");
115         m_strResulst.append("        <ExportUser>" + efm.getExportUser() + "</ExportUser>\n");
116         m_strResulst.append("    </Footer>\n</Receipt>\n");
117     }
118 
119     string getResult() {
120         return m_strResulst;
121     }
122 public:
123     XmlBuilder() {
124         m_strResulst = "";
125     }
126 private:
127     string m_strResulst;
128 };
129 
130 class Director {
131 public:
132     Director(Builder* pBuilder) : m_pBuilder(pBuilder) {
133 
134     }
135     void construct(ExportHeaderModel& ehm, vector < ExportDataModel*>& edmCollection, ExportFooterModel& efm) {
136         m_pBuilder->builderHeader(ehm);
137         m_pBuilder->builderBody(edmCollection);
138         m_pBuilder->builderFoot(efm);
139     }
140 private: 
141     Builder* m_pBuilder;
142 };
143 int main(void) {
144     ExportHeaderModel* pEhm = new ExportHeaderModel("南京1支行", "6月1日");
145     ExportDataModel* pEdm = new ExportDataModel("1", 10000.00f);
146     ExportDataModel* pEdm2 = new ExportDataModel("2", 20000.00f);
147     vector<ExportDataModel*> myVec;
148     myVec.push_back(pEdm);
149     myVec.push_back(pEdm2);
150     ExportFooterModel* pEfm = new ExportFooterModel("xcj");
151 
152     //ExportToTxtHelper helper;
153     //ExportToXmlHelper helper;
154     //helper.doExport(*pEhm, myVec, *pEfm);
155     Builder* pBuilder = new XmlBuilder();
156     Director* pDirector = new Director(pBuilder);
157     pDirector->construct(*pEhm, myVec, *pEfm);
158     cout << pBuilder->getResult() << endl;
159     system("pause");
160     return 0;
161 }
View Code

 

标签:edmCollection,void,iter,strResulst,模式,builder,append,pBuilder
From: https://www.cnblogs.com/zeliangzhang/p/17411343.html

相关文章

  • python - 单例模式
    Python中的单例单例模式(Singletonpattern),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。Python中实现单例的几种方法:使用模块使用函数装饰器使用类装饰器......
  • 使用eNSP模拟器配置GVRP(以Normal模式为例)
    知识点讲解:什么是GVRP?答:GARP(GenericAttributeRegistrationProtocol)协议主要用于建立一种属性传递扩散的机制,以保证协议实体能够注册和注销该属性。GARP作为一个属性注册协议的载体,可以用来传播属性。将GARP协议报文的内容映射成不同的属性即可支持不同上层协议应用。GVRP(GARP......
  • 依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组
    依赖注入(DI)是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。Singleton服务为什么不能依赖Scoped服务?多个构造函数的选择机制?源码是如何识别循环依赖的?虽然我们可......
  • 模板模式(Template Pattern)
    模板模式一、介绍  模板模式(TemplatePattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使......
  • 组合模式(Composite Pattern)
    组合模式一、概述  组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。二、介绍......
  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......
  • Day01 web应用模式与api接口
    1Web应用模式#前后端混合开发 -后端人员,既要写后端,django,又要写前端#前后端分离 -后端人员,只写后端,写一个个的API接口-前端人员,只写前端-最后项目写完,前后端联调2API接口#为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得......
  • 观察者模式(代码简单介绍)
    观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会被通知并自动更新。在这个模式中,改变状态的对象被称为“主题”,依赖者被称为“观察者”。当使用观察者模式时,同样有三个核心角色:主题(Subject)、观察者(Observer)和具体观......
  • CST为什么要关闭 GPU 卡的 ECC 模式而开启 TCC 模式?操作使用【详解】
    在使用CST软件之前,我们一般建议大家关闭GPU卡的ECC模式而开启TCC模式。那么,为什么要进行这样一个操作呢?在此之前,给大家科普一下什么是“ECC”和“TTC”。 “ECC” 其实是ErrorCorrectionCode的缩写,是NVIDIA(英伟达) 内自带的错误纠正代码,一般是用来检查和在某些情......
  • java设计模式【抽象工厂模式】
    java设计模式【抽象工厂模式】抽象工厂模式抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不......