设计模式课程设计

article/2025/11/6 10:09:20

文章目录

        • 题目要求:
      • 具体作业如下:
        • 一、设计思路
        • 二、所用模式介绍
          • 1.简单工厂模式
          • 2.装饰模式
          • 3.观察者模式
        • 具体实现过程
          • 程序分为三个部分:
        • PS.代码写的比较敷衍,主要是应付作业用,请大家自行斟酌抄袭

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


http://chatgpt.dhexx.cn/article/RbwIdweF.shtml

相关文章

23种设计模式总结

一、什么是设计模式 设计模式&#xff08;Design pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多赢…

设计模式之——桥接模式

设计模式&#xff1a; 前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案 设计模式的本质是面向对象设计原则的实际运用&#xff0c;是对类的封装性、继承性…

面向对象程序设计

之前复习面向对象的时候整理的&#xff0c;丢出来一起分享一下。因为复习得很赶&#xff0c;只是大致的整理&#xff0c;且大部分图片来自老师的ppt&#xff0c;可能不是很准确。如果要详细了解其中的某个知识点请另外搜索。 但是老师不讲武德啊&#xff0c;明明提纲给了不按提…

MVC设计模式

MVC的全名是Model View Controller&#xff0c;是模型(Model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;是一种设计模式。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码&#xff0c;将众多的业务逻辑聚集到一个部件里面&#xff0c;在…

设计模式考题复习

一.定义 设计模式六大基本原则&#xff1a; 单一职责原则&#xff1a;一个类或者一个方法只负责一项职责&#xff0c;尽量做到类的只有一个行为原因引起变化&#xff1b;里氏替换原则&#xff1a;能出现子类的地方都应该可以允许父类出现&#xff0c;也就是子类可以扩展父类的…

一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、设计模式是什么&#xff1f; 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应…

设计模式之策略模式详解

设计模式之策略模式详解 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c…

设计模式——桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;也叫做桥梁模式&#xff0c;结构型设计模式的一种&#xff0c;这个模式相对来说有些难理解。桥接&#xff0c;顾名思义&#xff0c;就是用来连接两个部分&#xff0c;为被分离了的抽象部分和实现部分搭桥。 …

设计模式23模式介绍

&#x1f3c6;作者简介&#xff1a;哪吒&#xff0c;CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家&#x1f4aa; &#xff0c;专注Java硬核干货分享&#xff0c;立志做到Java赛道全网Top N。 &#x1f3c6;本文收录于&#xff0c;Java基础教程系…

程序设计模式23+1种定义+UML图(有部分分析和联用)

程序设计模式这门课已经学完了&#xff0c;复习的时候做了一个这样的汇总&#xff0c;希望可以给后来学习这门课的同学一些帮助。 设计模式的分类 根据目的&#xff08;模式是用来做什么的&#xff09;可分为创建型(Creational)&#xff0c;结构型(Structural)和行为型(Behavio…

程序员必备的21种“设计模式之道”!

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了重用代码、让代码更容易被他人理解、保证代码可靠性。欢迎小伙伴们收藏关注&#xff0c;持续分享更多优质干货&#xff01; 设计模式之道 何为设计模式&#xff1f…

Microsoft Office Visio 缺失安装文件的解决方法(附viso安装密钥)

工作环境(蓝色粗体字为特别注意内容) 1&#xff0c;软件环境&#xff1a;Windows 7、Microsoft Office Visio Professional 2007、Microsoft Office Enterprise2007 2&#xff0c;参考文献&#xff1a;https://zhidao.baidu.com/question/1669305667489578747.html 最近在写文…

Microsoft visio 2019 professional 安装

Visio 2019 pro&#xff0c;全程关闭防火墙&#xff0c;运行文件采用管理员运行 Visio 2019 pro 下载jihuo汉化 Visio 2019 pro 下载 从下方链接下载 链接&#xff1a;https://pan.baidu.com/s/1OQXUfOItLJhbKsDf_u3pEQ 提取码&#xff1a;1234 里面包含&#xff1a; 点击V…

Oracle高水位线 HWM降低技巧

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;目前从事DBA及程序编程 &#xff08;Web\java\Python&#xff09;工作&#xff0c;主要服务于生产制造 现拥有 Oracle 11g OCP/OCM、 Mysql、Oceanbase&#xff08;OBCA&#xff09;认证 分布式TBase\TDSQL数据库、国…

HMM

Author: 李文乐;Email: cocoleYYoutlook.comDatawhale 直观理解 马尔可夫链&#xff08;英语&#xff1a;Markov chain&#xff09;&#xff0c;又称离散时间马尔可夫链&#xff08;discrete-time Markov chain&#xff0c;缩写为DTMC&#xff09;&#xff0c;因俄国数学家安德…

hwui简介

简介&#xff1a; hwui主要是android用于2d硬件绘图而加入的一个模块&#xff0c;在hwui之前&#xff0c;android主要是用skia来进行软件绘制&#xff0c;后由于绘制性能等问题&#xff0c;现在android的绘图几乎都是使用了hwui硬件加速绘图。hwui主要则是使用opengles来进行g…

【深度】广告流量分配HWM算法

在广告投放系统中&#xff0c;广告通常分为保量交付广告&#xff08;Guaranteed Delivery&#xff0c;GD&#xff0c;合约广告&#xff09;和不保量交付&#xff08;Non-Guaranteed Delivery&#xff0c;NGD&#xff0c;竞价广告&#xff09;两种。合约广告是提前签好合约的&am…

Oracle-HWM(High Water Mark) 高水位解读

读前须知&#xff1a;Oracle的逻辑存储管理 ORACLE在逻辑存储上分4个粒度 &#xff0c;由大到小为: 表空间, 段, 区 和 块. 块Block 块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而…

Oracle 高水位(HWM: High Water Mark) 说明

一. 准备知识&#xff1a;ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行. 每一个B…

分析HWM

下面结合官方文档和实验介绍下HWM: 以下英文摘自11gR2官方文档: HWM(high water mark)&#xff1a;The boundary between used and unused space in a segment. ORACLE9i之后开始使用自动段空间管理即ASSM,它使用位图来管理段空间的使用情况&#xff0c;如果表空间ASSM,则表空间…