设计模式课程设计
文章目錄
- 題目要求:
- 具體作業(yè)如下:
- 一、設(shè)計思路
- 二、所用模式介紹
- 1.簡單工廠模式
- 2.裝飾模式
- 3.觀察者模式
- 具體實現(xiàn)過程
- 程序分為三個部分:
- PS.代碼寫的比較敷衍,主要是應(yīng)付作業(yè)用,請大家自行斟酌抄襲
又到了一年兩度的課程設(shè)計時間,又要開始寫無聊的課程設(shè)計,學(xué)校是開了課程設(shè)計這門課的,但是疫情期間老師選的網(wǎng)課視頻的講解風(fēng)格不是很好,所以我就自己在bilibili上看視頻學(xué)習(xí)的,具體學(xué)習(xí)筆記可以看我的《設(shè)計模式》專欄
題目要求:
南陽理工學(xué)院----計算機(jī)與軟件學(xué)院
設(shè)計模式期終作業(yè) 3000+字論文一篇 要求: 1、結(jié)構(gòu)完整,理論聯(lián)系實踐,只總結(jié)知識點不行 2、要求有一整個項目設(shè)計到生成完整過程,用到至少三種學(xué)過的設(shè)計模式,一定要有代碼實現(xiàn)。 3、用咱們學(xué)院的封皮和格式完成,有題目、有封皮、有目錄、有分層。掛科模式啟動…(狗頭)
具體作業(yè)如下:
一、設(shè)計思路
作為一名準(zhǔn)程序員,每天使用頻率最高的就是電腦了,恰逢設(shè)計模式大作業(yè)需要編寫一個項目,就想通過模擬電腦制造銷售的過程來完成這一作業(yè)。整體過程大致如下,使用簡單工廠模式生產(chǎn)電腦,然后工廠直接銷售電腦,在銷售模式的電商模式中,使用觀察者模式模擬用戶查看物流信息,使用適配器模式模擬電腦接通電源的情況。
二、所用模式介紹
1.簡單工廠模式
簡單工廠模式屬于創(chuàng)建型模式,又叫靜態(tài)工廠方法模式,但不屬于23種GOF模式之一
簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例,它是工廠模式種最簡單實用的模式
簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪種產(chǎn)品類的實例
簡單工廠模式所包含的角色和職責(zé)如下:
? 工廠角色:簡單工廠模式的核心,它負(fù)責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯;工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象
? 抽象產(chǎn)品角色:簡單工廠模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實例所共有的公共接口
? 具體產(chǎn)品角色:簡單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對象都是充當(dāng)這個角色的某個具體類的實例
簡單工廠模式的UML類圖
在此項目中,準(zhǔn)備以此模式模擬電腦的生產(chǎn)廠商生產(chǎn)不同類型的電腦.
2.裝飾模式
裝飾模式:在不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)的給對象增加一些額外功能
模式結(jié)構(gòu)
裝飾模式的UML類圖
模式使用場景
模式特點
- 優(yōu)點
- 缺點
3.觀察者模式
觀察者模式中多個對象間存在一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新
模式的結(jié)構(gòu)
- 抽象主題:提供了一個用于保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法
- 具體主題:實現(xiàn)抽象目標(biāo)中的通知方法,當(dāng)具體主題的內(nèi)部狀態(tài)發(fā)生變化時,通知所有注冊過的觀察者對象
- 抽象觀察者:抽象類或接口,它包含了一個更新自己的抽象方法,當(dāng)接到具體主題的更改通知時被調(diào)用
- 具體觀察者:實現(xiàn)抽象觀察者中定義的抽象方法,以便在得到目標(biāo)的更改通知時更新自身的狀態(tài)
觀察者模式UML類圖
具體實現(xiàn)過程
程序分為三個部分:
在此過程中,我使用了簡單工廠模式生產(chǎn)電腦,使用裝飾者模式對電腦進(jìn)行裝配,使用觀察者模式讓買家和廠家關(guān)注物流信息,具體實現(xiàn)細(xì)節(jié)如下:
#include <iostream> #include <deque> using namespace std;//抽象電腦 class Computer { public:virtual void showName() = 0; };//筆記本電腦 class LapTop : public Computer { public:virtual void showName(){cout << "筆記本電腦創(chuàng)建成功!" << endl;} };//臺式主機(jī) class DeskTop : public Computer { public:virtual void showName(){cout << "臺式電腦創(chuàng)建成功!" << endl;} };//電腦工廠 class ComputerFactory { public:static Computer* Create(int type){if (type == 1)return new LapTop;else if (type == 2)return new DeskTop;elsereturn NULL;} };//抽象構(gòu)件:華為電腦 class computer_Huawei { public:virtual void showStatus() {} };//具體構(gòu)件:華為MagicBook電腦 class Huawei_MagicBook : public computer_Huawei { public:virtual void showStatus(){cout << "我是華為MagicBook,我是一臺優(yōu)秀的筆記本!!!" << 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(){//灰色機(jī)身cout << "我是一臺灰色的MagicBook!!!" << endl;}void showStatus(){cout << "我是華為MagicBook,我是一臺優(yōu)秀的筆記本!!!" << 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,我是一臺優(yōu)秀的筆記本!!!" << 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 << "我是賣家,我需要確認(rèn)物流信息沒有出現(xiàn)問題!" << 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 << "請輸入你想要創(chuàng)建的電腦類型:(筆記本電腦為1/臺式機(jī)為2)" << endl;cin >> computer_type;Computer* computer = factory->Create(computer_type);cout << "電腦生產(chǎn)完畢!!!" << 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; }程序運行結(jié)果如下:
PS.代碼寫的比較敷衍,主要是應(yīng)付作業(yè)用,請大家自行斟酌抄襲
總結(jié)
- 上一篇: 浅谈-61850-2-服务端模拟软件构建
- 下一篇: 单片机原理及应用 张鑫_单片机原理及应用