# DesignPattern
**Repository Path**: zhaoshubing/DesignPattern
## Basic Information
- **Project Name**: DesignPattern
- **Description**: 设计模式课程实验代码
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 15
- **Forks**: 4
- **Created**: 2022-04-06
- **Last Updated**: 2024-06-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 设计模式课程实验
## 实验 1(面向对象设计原则)
1、在某绘图软件中提供了多种大小不同的画笔(Pen),并且可以给画笔指定不同颜色,某设计人员针对画笔的结构设计了如图1-1所示的初始类图。

图 1-1
通过仔细分析,设计人员发现该类图存在非常严重的问题,如果需要增加一种新的大小的笔或者增加一种新的颜色,都需要增加很多子类,如增加一种绿色,则对应每一种大小的笔都需要增加一支绿色笔,系统中类的个数急剧增加。
试根据依赖倒转原则和合成复用原则对该设计方案进行重构,使得增加新的大小的笔和增加新的颜色都较为方便,请绘制重构之后的结构图(类图)。

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

图 1-3
在该图形库中,每个图形类(例如 Circle、Triangle 等)的 init()方法用于初始化所创建 的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:
(1) 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;
(2) 在图形库中增加并使用新的图形时需要修改客户类源代码;
(3) 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:
(1) 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形 时无须直接创建图形对象,甚至不需要关心具体图形类类名;
(2) 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
请绘制重构后的结构图(类图)。

## 实验 2(简单工厂模式、工厂方法模式)
1、使用简单工厂模式设计一个可以创建不同儿何形状(Shape)(例如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等)的绘图工具类,每个几何图形均具有绘制方法draw() 和擦除方法erase(),要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException异常。绘制类图并编程模拟实现。

2、在某网络管理软件中,需要为不同的网络协议提供不同的连接类.例如针对POP3协议的连接类POP3Connection、针对IMAP协议的连接类IMAPConnection、针对HTTP协议的连接类HTTPConnection等。由于网络连接对象的创建过程较为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类似的网络协议。现采用工厂方法模式进行设计,绘制类图并编程模拟实现。

## 实验 3(建造者模式、单例模式)
1、在某赛车游戏中,赛车包括方程式赛车、场地越野赛车、运动汽车、卡车等类型,不同类型的赛车的车身、发动机、轮胎、变速箱等部件有所区别。玩家可以自行选择赛车类型,系统将根据玩家的选择创建出一辆完整的赛车。现采用建造者模式实现赛车的构建,绘制对应的类图并编程模拟实现。

2、某Web性能测试软件中包含一个虚拟用户生成器(Virtual User Generator)。为了避免生成的虚拟用户数量不一致,该测试软件在工作时只允许启动唯一一个虚拟用户生成器。采用单例模式设计该虚拟用户生成器,绘制类图并分别使用饿汉式单例、双重检测锁和loDH三种方式编程模拟实现。

## 实验 4(适配器模式、组合模式)
1、某OA系统需要提供一个加密模块,将用户机密信息(例如口令、邮箱等)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。试使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。要求绘制相应的类图并编程模拟实现,需要提供对象适配器和类适配器两套实现方案。


2、某移动社交软件要增加一个群组(Group)功能。通过设置,用户可以将自己的动态信息(包括最新动态、新上传的视频以及分享的链接等)分享给某个特定的成员(Member), 也可以分享给某个群组中的所有成员;用户可以将成员添加至某个指定的群组;此外,还允许用户在一个群组中添加子群组,以便更加灵活地实现面向特定人群的信息共享。现采用组合模式设计该群组功能,绘制对应的类图并编程模拟实现。

## 实验 5(装饰模式、代理模式)
1、在某OA系统中提供一个报表生成工具,用户可以通过该工具为报表增加表头和表尾,允许用户为报表增加多个不同的表头和表尾,用户还可以自行确定表头和表尾的次序。为了能够灵活设置表头和表尾的次序并易于增加新的表头和表尾,现采用装饰模式设计该报表生成工具,绘制对应的类图并编程模拟实现。

2、在某电子商务系统中,为了提高查询性能,需要将一些频繁查询的数据保存到内存的辅助存储对象中(提示:可使用Map实现)。用户在执行查询操作时,先判断辅助存储对象中是否存在待查询的数据.如果不存在,则通过数据操作对象查询并返回数据,然后将数据保存到辅助存储对象中,否则直接返回存储在辅助存储对象中的数据。现采用代理模式中的缓冲代理实现该功能,要求绘制对应的类图并编程模拟实现。

## 实验 6(命令模式、迭代器模式)
1、某灯具厂商要生产一个智能灯具遥控器,该遥控器具有5个可编程的插槽,每个插槽都有一个控制灯具的开关,这5个开关可以通过蓝牙技术控制5个不同房间灯光的打开和关闭,用户可以自行设置每一个开关所对应的房间。现采用命令模式实现该智能遥控器的软件部分,绘制对应的类图并编程模拟实现。

2、设计一个逐页迭代器,每次可返回指定个数(一页)元素,并将该迭代器用于对数据进行分页处理。绘制对应的类图并编程模拟实现。

## 实验 7(观察者模式、模板方法模式)
1、在某数据挖掘工具的数据分类模块中,数据处理流程包括4个步骤.分别是:①读取数据;②转换数据格式;③调用数据分类算法;④显示数据分类结果。对于不同的分类算法而言,第①步、第②步和第④步是相同的,主要区别在于第③步。第③步将调用算法库中已有的分类算法实现,例如朴素贝叶斯分类(Naive Bayes)算法、决策树(Decision Tree) 算法、K最近邻(K-Nearest Neighbor, KNN)算法等。现釆用模板方法模式和适配器模式设计该数据分类模块,绘制对应的类图并编程模拟实现。

2、某文字编辑软件须提供如下功能:在文本编辑窗口中包含一个可编辑文本区和3个文本信息统计区,用户可以在可编辑文本区对文本进行编辑操作,第一个文本信息统计区用于显示可编辑文本区中出现的单词总数量和字符总数量,第二个文本信息统计区用于显示可编辑文本区中出现的单词(去重后按照字典序排序),第三个文本信息统计区用于按照出现频次降序显示可编辑文本区中出现的单词以及每个单词出现的次数(例如hello:5)。现采用观察者模式设计该功能,绘制对应的类图并编程模拟实现。

## 实验 8(综合)
1、在某FPS(First-Person Shooting,第一人称设计)游戏中提供了多个不同的游戏场景。在每一个游戏场景中,提供了对应的地图(Map)、天气(Weather)和游戏背景音乐(Sound)等。
请选择一种合适的设计模式对游戏场景进行设计,使得当用户选择游戏场景时,该场景所对应的地图、天气和背景音乐能够同时出现;此外,还可以方便地在该游戏中增加新的游戏场景。要求给出该设计模式的名称并结合实例绘制对应的结构图(即类图,类名、方法名和属性名可自行定义)。
(抽象工厂模式)

2、在某FPS游戏中,系统可以给所有游戏成员发送通知,例如提示任务执行完毕、发送新的任务提醒、发出敌人袭击警报等。
请选择一种合适的设计模式设计该系统通知模块,使得在系统中可以灵活地增加或删除游戏成员。要求给出该设计模式的名称并结合实例绘制对应的结构图(即类图,类名、方法名和属性名可自行定义)。
(观察者模式)
