設計模式課程設計


又到了一年兩度的課程設計時間,又要開始寫無聊的課程設計,學校是開了課程設計這門課的,但是疫情期間老師選的網課視頻的講解風格不是很好,所以我就自己在bilibili上看視頻學習的,具體學習筆記可以看我的《設計模式》專欄

題目要求:

南陽理工學院----計算機與軟件學院

設計模式期終作業 3000+字論文一篇
要求:
1、結構完整,理論聯繫實踐,只總結知識點不行
2、要求有一整個項目設計到生成完整過程,用到至少三種學過的設計模式,一定要有代碼實現。
3、用咱們學院的封皮和格式完成,有題目、有封皮、有目錄、有分層。

掛科模式啓動…(狗頭)

具體作業如下:

一、設計思路

作爲一名準程序員,每天使用頻率最高的就是電腦了,恰逢設計模式大作業需要編寫一個項目,就想通過模擬電腦製造銷售的過程來完成這一作業。整體過程大致如下,使用簡單工廠模式生產電腦,然後工廠直接銷售電腦,在銷售模式的電商模式中,使用觀察者模式模擬用戶查看物流信息,使用適配器模式模擬電腦接通電源的情況。

二、所用模式介紹

1.簡單工廠模式

簡單工廠模式屬於創建型模式,又叫靜態工廠方法模式,但不屬於23種GOF模式之一
簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例,它是工廠模式種最簡單實用的模式

簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪種產品類的實例

簡單工廠模式所包含的角色和職責如下:
• 工廠角色:簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯;工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象
• 抽象產品角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口
• 具體產品角色:簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例

簡單工廠模式的UML類圖
在這裏插入圖片描述
在此項目中,準備以此模式模擬電腦的生產廠商生產不同類型的電腦.

2.裝飾模式

裝飾模式:在不改變現有對象結構的情況下,動態的給對象增加一些額外功能

模式結構

  1. 抽象構件:給出一個抽象接口,以規範準備接受附加責任的對象 具體構件:實現抽象構件,通過裝飾角色爲其添加新的功能
  2. 抽象裝飾:繼承抽象構件,幷包含具體構件的實例,可以通過其擴展具體構件的功能
  3. 具體裝飾:實現抽象裝飾的相關方法,並給具體構件對象添加附加的責任

裝飾模式的UML類圖
在這裏插入圖片描述
模式使用場景

  1. 需要拓展一個類的功能,或者給一個類添加附加功能
  2. 需要動態的給一個對象添加功能,這些功能可以動態的撤銷
  3. 需要通過對現有的一組基本功能進行動態組合而產生多種複合功能時(繼承實現較爲困難)

模式特點

  • 優點
  1. 裝飾模式和繼承都能拓展對象的功能,裝飾模式更加靈活
  2. 無需創建新的子類即可拓展對象的行爲
  • 缺點
  1. 裝飾模式會導致設計中出現許多小類,會使程序變得更加複雜
3.觀察者模式

觀察者模式中多個對象間存在一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新

模式的結構

  • 抽象主題:提供了一個用於保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法
  • 具體主題:實現抽象目標中的通知方法,當具體主題的內部狀態發生變化時,通知所有註冊過的觀察者對象
  • 抽象觀察者:抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用
  • 具體觀察者:實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態

觀察者模式UML類圖

在這裏插入圖片描述

具體實現過程

程序分爲三個部分:
  1. 電腦的生產
  2. 電腦的裝配
  3. 電腦的售出

在此過程中,我使用了簡單工廠模式生產電腦,使用裝飾者模式對電腦進行裝配,使用觀察者模式讓買家和廠家關注物流信息,具體實現細節如下:

#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;
		else
			return 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()
	{
		//銳龍CPU

		cout << "我是一臺配備銳龍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.代碼寫的比較敷衍,主要是應付作業用,請大家自行斟酌抄襲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章