builder模式

 

  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

 

posted @ 2023-05-18 11:05  泽良_小涛  阅读(5)  评论(0编辑  收藏  举报