郭新乐软件设计与体系结构-实验4.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流郭新乐软件设计与体系结构-实验4.精品文档.大连海事大学软件设计与体系结构课程实验报告(2015-2016学年第一学期)实验四 设计模式应用 班 级: 计算机科学与技术2班 学 号: 2220132451 姓 名: 程子璇 指导教师: 谢兄 成 绩: 2016年 01 月 02日目录1实验目的32实验内容33实验要求34实验步骤35总结与体会125.1实验中出现的问题及其解决方案125.2总结125.3体会121 实验目的1.1 利用Observer、单件等设计模式开发实现一个小的系统。1.2 通过常用的设计模式的实例实验,熟悉设计模式特点及应用条件,掌握基于设计模式的软件系统的设计与开发应用。2 实验内容2.1 用C+语言实现系统。2.2 利用设计模式设计并实现一个简单的图形编辑系统。程序截图3 实验要求(1) 深入复习教材中介绍的各种设计模式。(2) 实验步骤和实验总结中要详细描述实验过程中出现的问题、原因和解决方法。4 实验步骤4.1采用单件设计模式设计抽象工厂类,画出类结构图,写出类结构图对应的代码原型,并写出相应的主函数中的实现代码。4.1.1. 类结构图4.1.2. 代码原型namespace gesclass AbstractFactorypublic:AbstractFactory()if (_count = 1)if (_pInstance)delete _pInstance;-_count;protected:AbstractFactory() public:virtual Line* CreateProductLine(const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id) return nullptr;virtual Symbol* CreateProductSymbol(const int& posX, const int& posY, const int&id) return nullptr; virtual Text* CreateProductText(const int& posX, const int& posY, const int&id) return nullptr; virtual Rectangle* CreateProductRectangle(const int& posX0, const int& posY0, const int& posX1, const int& posY1, const int& id) return nullptr; virtual Picture* CreateProductPicture(const int& id)return new Picture(id);public:static AbstractFactory* CreateInstance()if (nullptr = _pInstance)_pInstance = new AbstractFactory();+_count;return _pInstance;protected:staticAbstractFactory*_pInstance;staticint_count;class ConcreteFactory1 : public AbstractFactorypublic:ConcreteFactory1()if (_count = 1)if (_pInstance)delete _pInstance;-_count;private:ConcreteFactory1()public:virtual Line* CreateProductLine(const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id) overridereturn new Line1(posX0, posY0, posX1, posY1, id);virtual Symbol* CreateProductSymbol(const int& posX, const int& posY, const int&id) overridereturn new Symbol1(posX, posY, id);virtual Text* CreateProductText(const int& posX, const int& posY, const int&id) overridereturn new Text1(TEXT("双击输入标注内容"), posX, posY, id);virtual Rectangle* CreateProductRectangle(const int& posX0, const int& posY0, const int& posX1, const int& posY1, const int& id) overridereturn new Rectangle1(posX0, posY0, posX1, posY1, id);/ Hidden interfacesvirtual Picture* CreateProductPicture(const int& id) override return nullptr; public:static ConcreteFactory1* CreateInstance()if (nullptr = _pInstance)_pInstance = new ConcreteFactory1();+_count;return _pInstance;protected:staticConcreteFactory1*_pInstance;staticint_count;class ConcreteFactory2 : public AbstractFactorypublic:ConcreteFactory2()if (_count = 1)if (_pInstance)delete _pInstance;-_count;private:ConcreteFactory2()public:virtual Line* CreateProductLine(const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id) overridereturn new Line2(TEXT("200"), posX0, posY0, posX1, posY1, id);virtual Symbol* CreateProductSymbol(const int& posX, const int& posY, const int&id) overridereturn new Symbol2(TEXT("静61-127C"), posX, posY, id);virtual Text* CreateProductText(const int& posX, const int& posY, const int&id) overridereturn new Text2(TEXT("双击输入标注内容"), posX, posY, id);virtual Rectangle* CreateProductRectangle(const int& posX0, const int& posY0, const int& posX1, const int& posY1, const int& id) overridereturn new Rectangle2(posX0, posY0, posX1, posY1, id);/ Hidden interfacesvirtual Picture* CreateProductPicture(const int& id) override return nullptr; public:static ConcreteFactory2* CreateInstance()if (nullptr = _pInstance)_pInstance = new ConcreteFactory2();+_count;return _pInstance;protected:staticConcreteFactory2*_pInstance;staticint_count; / namespace ges4.1.3. 主函数中的实现代码_pFactory = AbstractFactory:CreateInstance();_pFactory = ConcreteFactory2:CreateInstance();_pFactory = ConcreteFactory1:CreateInstance();4.2采用Composite设计模式设计直线、符号、字符串、方框及复合图形,画出类结构图,写出类结构图对应的代码原型,并写出相应的主函数中的实现代码。4.2.1 类结构图4.2.2. 代码原型namespace gesclass Client;/ forward declaring class Client/ class Graphicclass Graphic abstract : public IDedpublic:Graphic(const int& id) : IDed(id)virtual Graphic() ;public:virtual void Draw(Client* pView, const HDC& hdc) const = 0;virtual void Update(Client* pView, const HDC& hdc) const = 0;virtual void Add(Graphic* pGraphicObj) = 0;virtual void Remove(const int& id) = 0;virtual Graphic*GetChild(const int& id) = 0;virtualvoidOnMove(const short& deltaX, const short& deltaY) = 0;public:virtual boolIsHit(const int& x, const int& y) const = 0;virtual intQueryInterface() const = 0;virtual boolSave(HANDLE hFile) const = 0;virtualboolLoad(HANDLE hFile) = 0;/ class Pictureclass Picture : public Graphicpublic:Picture(const int& id) : Graphic(id), _real(false)Picture()if (_real)for (auto& pObj : _pGraphics)delete pObj;/ Implementationspublic:virtual void Draw(Client* pView, const HDC& hdc) const overridevirtual void Update(Client* pView, const HDC& hdc) const overridefor (auto& pObj : _pGraphics)pObj->Update(pView, hdc);virtual void Add(Graphic* pGraphicObj) overridefor (auto& pObj : _pGraphics)if (pObj->IDEqual(pGraphicObj->GetID()return;/ Error: Conflict with existing graphic_pGraphics.push_back(pGraphicObj);virtual void Remove(const int& id) overridestd:vector<ges:Graphic*>:const_iteratorciter;for (citer = _pGraphics.begin();citer != _pGraphics.end();+citer)if (*citer)->IDEqual(id)delete (*citer);_pGraphics.erase(citer);return;virtual Graphic* GetChild(const int& id) overridefor (auto& pChild : _pGraphics)if (pChild->IDEqual(id)return pChild;return nullptr;virtualvoid OnMove(const short& deltaX, const short& deltaY) overridefor (auto& pObj : _pGraphics)pObj->OnMove(deltaX, deltaY);virtual bool Save(HANDLE hFile) const overrideDWORDbw = 0;int gt = GT_PICTURE;intgroup = GES_FILE_GROUP_TOUCH;/ Write GT into the file.if (FALSE = WriteFile(hFile, >, sizeof(int), &bw, nullptr)return false;for (auto& pObj : _pGraphics)/ Write Group-Begin flag into the file.if (FALSE = WriteFile(hFile, &group, sizeof(int), &bw, nullptr)return false;if (false = pObj->Save(hFile)CloseHandle(hFile);return false;return true;virtualbool Load(HANDLE hFile) override;virtual int QueryInterface() const overridereturn GT_PICTURE;/ This is a picture class.public:virtual bool IsHit(const int& x, const int& y) const overridefor (auto& pObj : _pGraphics)if (pObj->IsHit(x, y)return true;return false;virtual void GetGraphicsPtrs(std:vector<Graphic*>& pGraphics) constpGraphics = _pGraphics;public:inlinevoid SetReal(const bool& real) _real = real; private:std:vector<Graphic*>_pGraphics;bool_real;namespace gesclass Client;/ forward declaring class Clientclass Symbol abstract : public Graphicpublic:Symbol(const int& id) : Graphic(id)public:virtual void SetText(TCHAR* pText) = 0;public:/ Hid the unused interfacesvirtual void Add(Graphic* pGraphicObj) override ;virtual void Remove(const int& id) override ;virtual Graphic* GetChild(const int& id) override return nullptr; ;public:virtual intQueryInterface() const overridereturn GT_SYMBOL;/ This is a symbol class.class Line abstract : public Graphicpublic:Line(const int& id) : Graphic(id)public:virtual void SetStartPos(const int& posX, const int& posY) = 0;virtual void SetEndPos(const int& posX, const int& posY) = 0;virtual void SetText(TCHAR* pText) = 0;public:virtual bool IsPossibleToViewThis() const = 0;public:/ Hid the unused interfacesvirtual void Add(Graphic* pGraphicObj) override ;virtual void Remove(const int& id) override ;virtual Graphic* GetChild(const int& id) override return nullptr; ;public:virtual int QueryInterface() const overridereturn GT_LINE;/ This is a line class.class Text abstract : public Graphicpublic:Text(const int& id) : Graphic(id)public:virtual void SetFontSize(const int& fontSize) = 0;virtual void SetText(TCHAR* pText) = 0;public:/ Hid the unused interfacesvirtual void Add(Graphic* pGraphicObj) override ;virtual void Remove(const int& id) override ;virtual Graphic* GetChild(const int& id) override return nullptr; ;public:virtual int QueryInterface() const overridereturn GT_TEXT;/ This is a text class.class Rectangle abstract : public Graphicpublic:Rectangle(const int& id) : Graphic(id)public:virtual void SetStartPos(const int& posX, const int& posY) = 0;virtual void SetEndPos(const int& posX, const int& posY) = 0;virtual bool IsPossibleToViewThis() const = 0;public:/ Hid the unused interfacesvirtual void Add(Graphic* pGraphicObj) override ;virtual void Remove(const int& id) override ;virtual Graphic* GetChild(const int& id) override return nullptr; ;public:virtual int QueryInterface() const overridereturn GT_RECTANGLE;/ This is a rectangle class.class Line1 : public Linepublic:Line1(const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id);Line1();public:/ Implementations:virtual void Draw(Client* pView, const HDC& hdc) const override;virtual void Update(Client* pView, const HDC& hdc) const override;virtualvoid OnMove(const short& deltaX, const short& deltaY) override;virtual bool IsHit(const int& x, const int& y) const override;virtual bool Save(HANDLE hFile) const override;virtualbool Load(HANDLE hFile) override;public:virtual void SetStartPos(const int& posX, const int& posY) override;virtual void SetEndPos(const int& posX, const int& posY) override;virtual void SetText(TCHAR* pText) override virtual bool IsPossibleToViewThis() const override;virtual int QueryInterface() const overridereturn (GT_LINE| GT_LINE1);/ This is a line1 class.private:int_posX0;int_posY0;int_posX1;int_posY1;class Line2 : public Linepublic:Line2(TCHAR* pText, const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id);Line2();public:/ Implementations:virtual void Draw(Client* pView, const HDC& hdc) const override;virtual void Update(Client* pView, const HDC& hdc) const override;virtualvoid OnMove(const short& deltaX, const short& deltaY) override;virtual bool IsHit(const int& x, const int& y) const override;virtual bool Save(HANDLE hFile) const override;virtualbool Load(HANDLE hFile) override;public:virtual void SetStartPos(const int& posX, const int& posY) override;virtual void SetEndPos(const int& posX, const int& posY) override;virtual void SetText(TCHAR* pText) override;virtual bool IsPossibleToViewThis() const override;virtual intQueryInterface() const overridereturn (GT_LINE | GT_LINE2);/ This is a line2 class.private:int_posX0;int_posY0;int_posX1;int_posY1;public:TCHAR*_pText;class Text1 : public Textpublic:Text1(TCHAR* pText, const int& posX, const int& posY, const int& id);Text1();public:/ Implementations:virtual void Draw(Client* pView, const HDC& hdc) const override;virtual void Update(Client* pView, const HDC& hdc) const override;virtualvoid OnMove(const short& deltaX, const short& deltaY) override;virtual bool IsHit(const int& x, const int& y) const override;virtual bool Save(HANDLE hFile) const override;virtualbool Load(HANDLE hFile) override;virtual int QueryInterface() const overridereturn (GT_TEXT | GT_TEXT1);/ This is a text1 class.public:virtual void SetFontSize(const int& fontSize) override;virtual void SetText(TCHAR* pText) override;private:int_posX;int_posY;int_font_size;TCHAR*_pText;HFONT_hFont;class Text2 : public Textpublic:Text2(TCHAR* pText, const int& posX, const int& posY, const int& id);Text2();public:/ Implementations:virtual void Draw(Client* pView, const HDC& hdc) const override;virtual void Update(Client* pView, const HDC& hdc) const override;virtualvoid OnMove(const short& deltaX, const short& deltaY) override;virtual bool IsHit(const int& x, const int& y) const override;virtual bool Save(HANDLE hFile) const override;virtualbool Load(HANDLE hFile) override;virtual intQueryInterface() const overridereturn (GT_TEXT | GT_TEXT2);/ This is a text2 class.public:virtual void SetFontSize(const int& fontSize) override;virtual void SetText(TCHAR* pText) override;private:int_posX;int_posY;int_font_size;TCHAR*_pText;HFONT_hFont;class Rectangle1 : public Rectanglepublic:Rectangle1(const int& posX0, const int& posY0,const int& posX1, const int& posY1, const int& id);Rectangle1();public:virtual void SetStartPos(const int& posX, const int& posY) override;virtual void SetEndPos(const int& posX, const int& posY) override;public:/ Implementations:virtual void Draw(Client* pView, const HDC& hdc) const override;virtual void Update(Client* pView, const HDC& hdc) const override;virtualvoid OnMove(const short& deltaX, const short& deltaY) override;virtual bool IsHit(const int& x, const int& y) const override;virtual bool IsPossibleToViewThis() const override;virtual bool Save(HANDLE hFile) const override;virtualbool Load(HANDLE hFile) override;virtual intQueryInterface() const overridereturn (GT_RECTANGLE | GT_RECTANGLE1);/ This is a rectangle1 class.private:int_posX0;int_posY0;int_posX1;int_posY1;class Rectangle2 : public Rectanglepublic:Rectangle2(const int& posX0, const int&