【课程作业】软件设计模式实验一

一、实验目的

  1. 熟练使用面向对象设计原则对系统进行重构;

  2. 熟练使用面向对象编程语言(JAVA或C++)实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、适配器模式、外观模式、模板方法模式和建造者模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何在软件开发中使用这些模式。

二、实验要求

  1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;

  2. 结合实例,正确无误地绘制应用模式后的UML图;

  3. 应用相应的模式实现实例,要求代码运行正确,给出运行结果。

三、实验内容

1.

在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示

在该图形库中,每个图形类(如CircleTriangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。

客户类(Client)在使用该图形库时发现存在如下问题:

  1. 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;

  2. 在图形库中增加并使用新的图形时需要修改客户类源代码;

  3. 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。

现需要根据面向对象设计原则对该系统进行重构,要求如下:

  1. 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;

  2. 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。

绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。

重构之后的类图

重构过程中所使用的面向对象设计原则及简要说明

采用了工厂方法模式,所谓工厂模式则是定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到子类。使用了开闭原则,单一职责原则。

2.

设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常,绘制类图并编程模拟实现。

类图

3.

某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全部拷贝到移动存储介质(例如MMC卡或SD卡)中。在实现过程中需要与多个已有的类进行交互,例如通讯录管理类、短信管理类等,为了降低系统的耦合度,试设计并编程模拟实现该一键备份功能。

类图

4.

现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactoryJpgReaderFactory用于创建具体的图片读取器对象。试设计该程序,绘制类图并编程模拟实现。需充分考虑系统的灵活性和可扩展性

类图

5.

现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSortquickSort(int[])方法实现了快速排序算法,类BinarySearch binarySearch(int[], int)方法实现了二分查找算法。如何在不修改源代码的情况下,使DataOperation接口可以复用类QuickSort和类BinarySearch的方法。请选用合适的模式编写程序模拟该场景。

类图

6.

请设计并实现一个“电脑配置商店”的小程序,要求如下:

  1. 电脑由CPU、主板、显卡、内存、硬盘等配件组合而成。现电脑配置有两种配置方案。

  2. 根据配置方案可以显示具体配置信息。

  3. 根据配置方案可以显示价格。

类图

7.

某软件公司要为某银行的业务支撑系统开发一个利息计算模块,利息的计算流程如下:

  1. 系统根据账号和密码验证用户信息,如果用户信息错误,则系统显示出错提示。

  2. 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式)。

  3. 系统显示利息。

现请使用模板方法模式设计该利息计算模块。

类图

8.

某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、脸型、服装、发型等外部特性有所差异,使用建造者模式创建人物角色对象,要求绘制类图并编码实现。

类图

9.

现在需要设计一款格斗类游戏软件,为了适应不同等级玩家的需要,游戏特地安排了三个难度级别:

  1. 初等级别:敌方士兵反应迟钝,怪兽步履缓慢,即便是初学者也能够很轻松地取胜;

  2. 中间级别:敌方士兵反应适度,怪兽步履速度中等,中级玩家有可能取胜;

  3. 高难级别:敌方士兵反映敏捷,怪兽狰狞狡诈,就算是高级玩家也难逃被击毙的厄运。

该游戏软件需要具备良好的灵活性和可扩展性,玩家可以自由选择不同的难度等级,开发人员可以在不修改既有代码的基础上增加新的难度级别。试设计该游戏软件,绘制类图并编程模拟实现。

类图

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
蜀ICP备19030250号
Built with Hugo
Theme Stack designed by Jimmy