设计模式课程设计


又到了一年两度的课程设计时间,又要开始写无聊的课程设计,学校是开了课程设计这门课的,但是疫情期间老师选的网课视频的讲解风格不是很好,所以我就自己在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.代码写的比较敷衍,主要是应付作业用,请大家自行斟酌抄袭
  • 17
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值