当前位置: 首页 > news >正文

Windows程序设计课程作业-1

文章目录

  • 1. 作业内容
  • 2. 设计思路分析与难点
  • 3. 代码实现
    • 3.1 接口定义
    • 3.2 工厂类实现
    • 3.3 委托和事件
    • 3.4 主函数
    • 3.5 代码运行结果
  • 4. 代码地址
  • 5. 总结&改进思路
  • 6. 阅读参考


1. 作业内容

  使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:

  • 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
  • 定义类 WuhanFactoryNanjingFactoryChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
  • 使用委托 ProductionDelegate 定义生产委托。
  • Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。

2. 设计思路分析与难点

  在面向对象编程中,接口定义了方法的规范,委托则允许在运行时选择具体的方法执行,这两者同时使用,使得不同的工厂类可以根据需要实现这些方法,增强了程序的灵活性和扩展性,提高了代码的动态性。总体上讲,该系统的设计围绕接口和委托展开。
  如何处理工厂生产能力的差异性是一个较为棘手的问题,例如,南京工厂无法生产鸭翅。我们需要一种机制来优雅地处理不支持的生产操作。
  我们利用接口方法的实现来体现生产能力的差异性,在不支持的方法中抛出NotImplementedException异常。这确保了程序在尝试执行不支持的操作时会清楚地报错,使得错误处理更加明确。
  如图所示:

  在这里只是简单地抛出异常并且报错,并不去继续其他处理。

3. 代码实现

3.1 接口定义

interface IProductionFactory
{
void ProduceNeck();
void ProduceWing();
}

  IProductionFactory包含两个方法:ProduceNeck() ProduceWing()。这两个方法分别代表生产鸭脖和鸭翅的能力。

3.2 工厂类实现

class WuhanFactory : IProductionFactory
{public void ProduceNeck() {Console.WriteLine("Wuhan Factory produce duck neck.");}public void ProduceWing() {Console.WriteLine("Wuhan Factory produce duck wing.");}
}
class NanjingFactory : IProductionFactory
{public void ProduceNeck(){Console.WriteLine("Nanjing Factory produce duck neck.");}public void ProduceWing(){throw new NotImplementedException("Nanjing Factory has no access to produce duck wing!!!");}
}
class ChangshaFactory : IProductionFactory
{public void ProduceNeck(){throw new NotImplementedException("Changsha Factory has no access to produce duck neck!!!");}public void ProduceWing(){Console.WriteLine("Changsha Factory produce duck wing.");}
}

  在这里,我们创建了三个工厂类:WuhanFactoryNanjingFactoryChangshaFactory,每个类都实现了 IProductionFactory 接口。由于不同工厂能够生产的产品不同,我们通过用不同方式实现接口方法来体现他们在生产上的差异:

  • 若是能够实现生产该类产品,则正常输出语句xxx Factory produce duck xxx.
  • 若是不能生产该产品,则抛出NotImplementedException异常,异常信息为xxx Factory has no access to produce duck xxx.

3.3 委托和事件

//定义委托
public delegate void ProductionDelegate();//定义事件
public event ProductionDelegate ExecuteOrder;

  我们定义了一个名为ProductionDelegate的委托,它不带参数且不返回值,用于封装生产方法的调用,并且定义了事件ExecuteOrder,用于记录实现各个工厂的方法。

3.4 主函数

  在 Main 方法中,我们为每个工厂实例化了相应的生产委托,并通过这些委托调用生产方法。

static void Main(string[] args)
{//分别为三个工厂类实例化IProductionFactory Wuhan_Factory = new WuhanFactory();IProductionFactory Nanjing_Factory = new NanjingFactory();IProductionFactory Changsha_Factory = new ChangshaFactory();//为每一个工厂都创建一个单独的委托ProductionDelegate wuhanProduction = Wuhan_Factory.ProduceNeck;wuhanProduction += Wuhan_Factory.ProduceWing;ProductionDelegate nanjingProduction = Nanjing_Factory.ProduceNeck;nanjingProduction += Nanjing_Factory.ProduceWing;ProductionDelegate changshaProduction = Changsha_Factory.ProduceWing;changshaProduction += Changsha_Factory.ProduceNeck;Console.WriteLine("Wuhan Factory production:");try{wuhanProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.WriteLine("Nanjing Factory production:");try{nanjingProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.WriteLine("Changsha Factory production:");try{changshaProduction();}catch (NotImplementedException e){Console.WriteLine(e.Message);}Console.ReadLine();}

  除此之外,还采用trycatch语句块来实现订单的执行,对于每个工厂的委托,都使用了一个try-catch语句块,能够在出现异常的时候及时抛出,并且不影响其他工厂的生产。

3.5 代码运行结果

4. 代码地址

  代码仓库:https://github.com/hmcy-zbx/Windows_homework

5. 总结&改进思路

  通过本次项目的练习,我们展示了如何使用 C# 中的面向对象特性来构建一个简单的实现周黑鸭多工厂生产管理系统。该系统不仅展示了接口、类和委托的使用,还体现了面向对象设计原则继承性的应用,是一次很好的练习。
  在未来,还可以使用设计模式对其进行改进,利用简单工厂模式或者抽象工厂模式来实现可以使其更加接近实际生产的需求。

6. 阅读参考

  C#教程-接口:csharp-interface
  C#教程-委托:BV1TP411R72r
  C#教程-事件:BV1ou411a7YD
  简单工厂模式和抽象工厂模式:Graphic Design Patterns

相关文章:

Windows程序设计课程作业-1

文章目录 1. 作业内容2. 设计思路分析与难点3. 代码实现3.1 接口定义3.2 工厂类实现3.3 委托和事件3.4 主函数3.5 代码运行结果 4. 代码地址5. 总结&改进思路6. 阅读参考 1. 作业内容 使用 C# 编码(涉及类、接口、委托等关键知识点),实现…...

2024年河北省网络建设与运维-省赛-nginx 和tomcat 服务服务步骤

题目: 5.nginx 和tomcat 服务 任务描述:利用系统自带tomcat,搭建 Tomcat网站。 (1)配置 linux2 为 nginx 服务器,网站目录为/www/nginx,默认文档 index.html 的内容为“HelloNginx”&#xf…...

CentOS下部署ftp服务

要在linux部署ftp服务首先需要安装vsftpd服务 yum install vsftpd -y 安装完成后需要启动vsftpd服务 systemctl start vsftpd 为了能够访问ftp的端口,需要在防火墙中开启ftp的端口21,否则在使用ftp连接的时候会报错No route to host. 执行如下命令为f…...

伦敦银几点开盘?为什么交易不了?

近期是西方的假期,伦敦银市场因而休市。很多朋友看到之前伦敦银上涨那么厉害,正摩拳擦掌准备入场大展拳脚,然而现在却吃了一个大瘪:怎么我刚准备好大展拳脚,结果却没有开盘呢?到底伦敦银几点开盘&#xff1…...

快手开放平台对接内容管理demo

其中包括用户授权&#xff0c;获取accessToken&#xff0c;获取用户信息&#xff0c;自动上传视频&#xff0c;发布视频&#xff0c;视频列表&#xff0c;删除视频等 <?php namespace app\controller;use app\BaseController; use think\Exception; use think\facade\App;…...

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…...

WPS的JS宏如何批量实现文字的超链接

表格中需要对文字进行超链接&#xff0c;每个链接指引到不同的地址。例如&#xff1a; 实现如下表格中&#xff0c;文件名称超级链接到对应的文件路径上&#xff0c;点击对应的文件名称&#xff0c;即可打开对应的文件。 序号文件名称文件路径1变更申请与处理表.xls文档\系统…...

0203逆矩阵-矩阵及其运算-线性代数

文章目录 一、逆矩阵的定义、性质和求法二、逆矩阵的初步应用结语 一、逆矩阵的定义、性质和求法 定义7 对于 n n n阶矩阵A&#xff0c;如果有一个 n n n阶矩阵B&#xff0c;使 A B B A E ABBAE ABBAE 则说矩阵A是可逆的&#xff0c;并把矩阵B称为A的逆矩阵&#xff0c;简称逆…...

加州大学欧文分校英语基础语法专项课程03:Simple Past Tense 学习笔记(完结)

Learn English: Beginning Grammar Specialization Specialization Certificate course 3&#xff1a; Simple Past Tense Course Certificate 本文是学习 https://www.coursera.org/learn/simple-past-tense 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。…...

基于Java微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

7.网络编程-安全

目录 引言 Session Cookie JWT (JSON Web Token) 网络攻击 CSRF DDoS 其他常见网络攻击类型及应对措施 引言 Session、Cookie 和 JWT 都是Web开发中用于实现用户状态管理和身份验证的技术。它们各自有不同的特点和应用场景&#xff1a; Session Session 是一种服务器…...

信息泄露漏洞的JS整改方案

引言 &#x1f6e1;️ 日常工作中&#xff0c;我们经常会面临线上环境被第三方安全厂商扫描出JS信息泄露漏洞的情况&#xff0c;这给我们的系统安全带来了潜在威胁。但幸运的是&#xff0c;对于这类漏洞的整改并不复杂。本文将介绍几种可行的整改方法&#xff0c;以及其中一种…...

WKWebView的使用

一、简介 在iOS中&#xff0c;WKWebView是WebKit框架提供的一个用于展示网页内容的控件&#xff0c;相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤&#xff1a; 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...

iOS MT19937随机数生成,结合AES-CBC加密算法实现。

按处理顺序说明&#xff1a; 1. 生成随机数序列字符串函数 生成方法MT19937&#xff0c;初始种子seed&#xff0c;利用C库方法&#xff0c;生成&#xff1a; #include <random> //C 库头文件引入NSString * JKJMT19937Seed(uint32_t seed) {NSLog("MT19937Seed种…...

阿里云2024年优惠券获取方法及使用教程详解

阿里云是阿里巴巴集团旗下的云计算服务提供商&#xff0c;是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务&#xff0c;以及大数据、人工智能服务、精准定制基于场景的行业解决方案。 阿里云2024年优惠券的获取方…...

hadoop中hdfs的fsimage文件与edits文件

hadoop中hdfs的fsimage文件与edits文件的作用 首先&#xff0c;我们抛出fsimage和edits文件的功能描述。 Fsimage文件: HDFS文件系统元数据的一个永久性的检查点&#xff0c;其中包含HDFS文件系统的 所有目录和文件inode的序列化信息。 Edits文件:存放HDFS文件系统的所有更…...

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09;修复优…...

.net框架和c#程序设计第二次测试

一、实验内容 1、设计一个用户登录页面webform1.aspx&#xff0c;效果如下图所示&#xff1a; 2、点击webform1.aspx中“还未注册”连接进入register.aspx&#xff0c;注册页面效果如下图所示&#xff1a;点击用户注册信息到usershow.aspx页面&#xff0c;并显示注册的用户信息…...

芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第三集】芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖高效AsDDet检测头组合改进,适用于 YOLOv8 …...

自媒体内容创作助手:7款必备ai写作工具一览! #学习方法#科技#其他

这些工具不仅可以快速生成高质量的文本内容&#xff0c;还可以根据用户的需求进行个性化定制。它们可以帮助我们节省大量的时间和精力&#xff0c;让我们更加专注于创意和细节的打磨。本文将为大家详细介绍几个AI写作工具&#xff0c;让你在写作领域更上一层楼。 1.七燕写作 这…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...