设计模式课程设计
文章目錄
- 題目要求:
- 具體作業如下:
- 一、設計思路
- 二、所用模式介紹
- 1.簡單工廠模式
- 2.裝飾模式
- 3.觀察者模式
- 具體實現過程
- 程序分為三個部分:
- PS.代碼寫的比較敷衍,主要是應付作業用,請大家自行斟酌抄襲
又到了一年兩度的課程設計時間,又要開始寫無聊的課程設計,學校是開了課程設計這門課的,但是疫情期間老師選的網課視頻的講解風格不是很好,所以我就自己在bilibili上看視頻學習的,具體學習筆記可以看我的《設計模式》專欄
題目要求:
南陽理工學院----計算機與軟件學院
設計模式期終作業 3000+字論文一篇 要求: 1、結構完整,理論聯系實踐,只總結知識點不行 2、要求有一整個項目設計到生成完整過程,用到至少三種學過的設計模式,一定要有代碼實現。 3、用咱們學院的封皮和格式完成,有題目、有封皮、有目錄、有分層。掛科模式啟動…(狗頭)
具體作業如下:
一、設計思路
作為一名準程序員,每天使用頻率最高的就是電腦了,恰逢設計模式大作業需要編寫一個項目,就想通過模擬電腦制造銷售的過程來完成這一作業。整體過程大致如下,使用簡單工廠模式生產電腦,然后工廠直接銷售電腦,在銷售模式的電商模式中,使用觀察者模式模擬用戶查看物流信息,使用適配器模式模擬電腦接通電源的情況。
二、所用模式介紹
1.簡單工廠模式
簡單工廠模式屬于創建型模式,又叫靜態工廠方法模式,但不屬于23種GOF模式之一
簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例,它是工廠模式種最簡單實用的模式
簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪種產品類的實例
簡單工廠模式所包含的角色和職責如下:
? 工廠角色:簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯;工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象
? 抽象產品角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口
? 具體產品角色:簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例
簡單工廠模式的UML類圖
在此項目中,準備以此模式模擬電腦的生產廠商生產不同類型的電腦.
2.裝飾模式
裝飾模式:在不改變現有對象結構的情況下,動態的給對象增加一些額外功能
模式結構
裝飾模式的UML類圖
模式使用場景
模式特點
- 優點
- 缺點
3.觀察者模式
觀察者模式中多個對象間存在一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新
模式的結構
- 抽象主題:提供了一個用于保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法
- 具體主題:實現抽象目標中的通知方法,當具體主題的內部狀態發生變化時,通知所有注冊過的觀察者對象
- 抽象觀察者:抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用
- 具體觀察者:實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態
觀察者模式UML類圖
具體實現過程
程序分為三個部分:
在此過程中,我使用了簡單工廠模式生產電腦,使用裝飾者模式對電腦進行裝配,使用觀察者模式讓買家和廠家關注物流信息,具體實現細節如下:
#include <iostream> #include <deque> using namespace std;//抽象電腦 class Computer { public:virtual void showName() = 0; };//筆記本電腦 class LapTop : public Computer { public:virtual void showName(){cout << "筆記本電腦創建成功!" << endl;} };//臺式主機 class DeskTop : public Computer { public:virtual void showName(){cout << "臺式電腦創建成功!" << endl;} };//電腦工廠 class ComputerFactory { public:static Computer* Create(int type){if (type == 1)return new LapTop;else if (type == 2)return new DeskTop;elsereturn NULL;} };//抽象構件:華為電腦 class computer_Huawei { public:virtual void showStatus() {} };//具體構件:華為MagicBook電腦 class Huawei_MagicBook : public computer_Huawei { public:virtual void showStatus(){cout << "我是華為MagicBook,我是一臺優秀的筆記本!!!" << endl;} };//抽象裝飾:外觀顏色 class Color : public computer_Huawei { public:computer_Huawei* magicbook;Color(computer_Huawei* Huawei_MagicBook) {this->magicbook = Huawei_MagicBook;}virtual void showStatus() {}};//具體裝飾:星空灰 class greyColor : public Color { public:greyColor(computer_Huawei* magicbook) : Color(magicbook) {}//增加額外裝飾void Grey(){//灰色機身cout << "我是一臺灰色的MagicBook!!!" << endl;}void showStatus(){cout << "我是華為MagicBook,我是一臺優秀的筆記本!!!" << endl;Grey();} };//具體裝飾:銳龍CPU class AMD_YES : public Color { public:AMD_YES(computer_Huawei* magicbook) : Color(magicbook) {}//增加額外裝飾void amd(){//銳龍CPUcout << "我是一臺配備銳龍CPU的MagicBook!!!" << endl;}void showStatus(){cout << "我是華為MagicBook,我是一臺優秀的筆記本!!!" << endl;amd();} };//抽象觀察者 class AbstractViewer { public:virtual void Update() = 0; };//具體觀察者:顧客 class customer : public AbstractViewer { public:customer(){cout << "我是顧客,我正在焦急的等待物流消息更新!" << endl;}void Update(){cout << "快遞到了,我飛奔去取我的快遞!!!" << endl;} };//具體觀察者B class seller : public AbstractViewer { public:seller(){cout << "我是賣家,我需要確認物流信息沒有出現問題!" << endl;}void Update(){cout << "買家收到貨了,我要打電話讓他給我好評!!!" << endl;} };//抽象主題 class AbstractInf { public:virtual void addViewer(AbstractViewer* receiver) = 0;virtual void removeViewer(AbstractViewer* receiver) = 0;virtual void tellAllViewer() = 0; };//具體主題:logStatus class logStatus : public AbstractInf { public:void addViewer(AbstractViewer* receiver){Viewers.push_back(receiver);}void removeViewer(AbstractViewer* receiver){auto it = find(Viewers.begin(), Viewers.end(), receiver);if (it != Viewers.end())Viewers.erase(it);}void tellAllViewer(){deque<AbstractViewer*>::iterator i = Viewers.begin();while (i != Viewers.end()){(*i++)->Update();}}private:deque<AbstractViewer*> Viewers; };int main() {ComputerFactory* factory = new ComputerFactory;int computer_type = 0;cout << "請輸入你想要創建的電腦類型:(筆記本電腦為1/臺式機為2)" << endl;cin >> computer_type;Computer* computer = factory->Create(computer_type);cout << "電腦生產完畢!!!" << endl;cout << "===============即將為電腦添加灰色外殼==============" << endl;computer_Huawei* huawei = new Huawei_MagicBook;huawei->showStatus();huawei = new greyColor(huawei);huawei->showStatus();cout << "===============即將為電腦配備銳龍CPU===============" << endl;huawei = new AMD_YES(huawei);huawei->showStatus();cout << "==============電腦售出,通知買家和賣家物流信息============" << endl;AbstractInf* plogStatus = new logStatus;plogStatus->addViewer(new seller);plogStatus->addViewer(new customer);plogStatus->tellAllViewer();system("pause");return 0; }程序運行結果如下:
PS.代碼寫的比較敷衍,主要是應付作業用,請大家自行斟酌抄襲
總結
- 上一篇: 浅谈-61850-2-服务端模拟软件构建
- 下一篇: asp.net ajax控件工具集 Au