# DesignPattern **Repository Path**: first-nana/DesignPattern ## Basic Information - **Project Name**: DesignPattern - **Description**: 23种设计模式 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-05-09 - **Last Updated**: 2023-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 关于设计模式的介绍https://www.cnblogs.com/Jayyi/p/13205718.html # 设计模式练习题 ## 简单工厂模式 某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数“Haier”,需要海信电视机时只需要传入参数“Hisense”,工厂可以根据传入的不同参数返回不同品牌的电视机。现使用简单工厂模式来模拟该电视机工厂的生产过程。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357434946-c7421621-bfa4-4c77-8ed5-2abcdf65a996.png#align=left&display=inline&height=240&margin=%5Bobject%20Object%5D&name=image.png&originHeight=251&originWidth=537&size=23393&status=done&style=none&width=513) ## ****工厂方法模式-日志记录器 某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式。现使用工厂方法模式设计该系统,并写出相应Java代码。尝试使用DOM和Java反射机制读取XML信息。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357558942-fbd7e863-6a69-45f6-97bd-934dec4ccbf9.png#align=left&display=inline&height=253&margin=%5Bobject%20Object%5D&name=image.png&originHeight=506&originWidth=886&size=67131&status=done&style=none&width=443) ## 抽象工厂模式实例-数据库操作工厂 ****![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357617547-a97d5396-ea6a-4f78-9397-ea49a14b625c.png#align=left&display=inline&height=309&margin=%5Bobject%20Object%5D&name=image.png&originHeight=618&originWidth=896&size=176599&status=done&style=none&width=448)**** ## 建造者模式 某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、脸型、服装、发型等外部特征有所差异,使用建造者模式创建人物角色对象,请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357656777-49c67c63-c0c3-4607-aebc-9c56d593b04b.png#align=left&display=inline&height=319&margin=%5Bobject%20Object%5D&name=image.png&originHeight=638&originWidth=774&size=49957&status=done&style=none&width=387) ## 原型模式 在某OA系统中,用户可以创建工作周报,由于某些岗位每周工作存在重复性,因此可以通过复制原有工作周报并进行局部修改来快速创建工作周报,现使用原型模式来实现该功能,请根据类图编程实现该系统,并写出相应Java代码。 ****![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357672733-857eee12-72ff-43d8-b3a4-ad45b22ddb07.png#align=left&display=inline&height=248&margin=%5Bobject%20Object%5D&name=image.png&originHeight=496&originWidth=625&size=31460&status=done&style=none&width=312.5)**** ## 单例模式 在操作系统中,打印池是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计,请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357704691-44810419-a1dd-4e25-96a3-40fe4614f306.png#align=left&display=inline&height=215&margin=%5Bobject%20Object%5D&name=image.png&originHeight=429&originWidth=591&size=51287&status=done&style=none&width=295.5) ## 外观模式 (加密模块) 某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块。请根据类图编程实现该系统,并写出相应Java代码。 ****![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357759730-fc6678e8-6930-4a42-b2db-739ba1e85b80.png#align=left&display=inline&height=223&margin=%5Bobject%20Object%5D&name=image.png&originHeight=447&originWidth=849&size=82674&status=done&style=none&width=424.5)**** ## 享元模式 (围棋棋子) 某软件公司设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是他们可以在棋盘的不同位置显示多次。请使用享元模式设计该软件,并写出相应Java代码。要求使用简单工厂模式和单例模式实现享元工厂类的设计。 ## 装饰模式 (多重加密系统) 某系统提供了一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加密。现使用装饰模式设计该多重加密系统。 ****![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357844669-eac2e1b1-c6f7-4813-96a7-e8fbc8872ece.png#align=left&display=inline&height=190&margin=%5Bobject%20Object%5D&name=image.png&originHeight=380&originWidth=722&size=61204&status=done&style=none&width=361)**** ## 代理模式 (日志记录代理) 在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,如在业务方法method()调用之前输出“方法method()被调用,调用事件为2018-05-01 10:10:10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。在代理类中调用真实业务的业务方法,使用代理模式设计该日志记录模块的结构。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357884988-4b9ad35c-2f2c-4342-8fd5-a0b2ddea047f.png#align=left&display=inline&height=211&margin=%5Bobject%20Object%5D&name=image.png&originHeight=421&originWidth=849&size=112230&status=done&style=none&width=424.5) ## 职责链模式 (在线文档帮助系统) 某公司欲开发一个软件的在线文档帮助系统,用户可以在任何一个查询环境中输入查询关键字,如果当前查询环境下没有相关的内容,则系统会将查询按照一定的顺序转发给其他查询环境。客户可以定制自己的查询顺序,例如先查询Java关键字,再查询SQL关键字,最后查询UML关键字。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357903852-2b9b2356-a082-4cd0-aac4-0b1a500d7af8.png#align=left&display=inline&height=200&margin=%5Bobject%20Object%5D&name=image.png&originHeight=400&originWidth=788&size=64583&status=done&style=none&width=394) ## 命令模式 (功能键设置) 为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,如功能键FunctionButton可以用于退出系统(SystemExitClass),也可以用于打开帮助界面(DisplayHelpClass)。用户可以通过修改配置文件来改变功能键的用途,现使用命令模式来设计该系统,使得功能键类与功能类之间解耦,相同的功能键可以对应不同的功能。请根据类图编程实现该系统,并写出相应Java代码。 ## ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357921663-71a2d9e5-2620-4d6f-bbbb-e603eff12f48.png#align=left&display=inline&height=195&margin=%5Bobject%20Object%5D&name=image.png&originHeight=343&originWidth=903&size=66897&status=done&style=none&width=513) ## 解释器模式 (机器指令解释器) 某计器人控制程序包含一些简单的英文指令,其文法规则如下: Expression::= direction action distance | composite composite::= Expression 'and' Expression direction::= 'up' | 'down' | 'left' | 'right' action:: = 'move' | 'run' distance::= an integer //一个整数 如输入:up move 5,则输出:“向上移动5个单位”; 如输入: down run 10 and left move 20,则输出"向下快速移动10个单位再向左移动20个单位"。 请根据以上描述,绘制系统的类图,并编码实现,要求能接收输入符合指令文法规则的其它复杂指令。 ## 迭代器模式 (商品名称遍历) 某商品管理系统的商品名称存储在一个字符串数组中,现需要自定义一个双向迭代器(MyIterator)实现对该商品名称数组的双向(前向和后向)遍历。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593357979032-09cef927-f32b-41aa-bfbf-7026fa5b49a7.png#align=left&display=inline&height=232&margin=%5Bobject%20Object%5D&name=image.png&originHeight=464&originWidth=904&size=47382&status=done&style=none&width=452) ## 观察者模式 (股票变化) 某在线股票软件需要提供如下功能:当股票购买者所购买的某支股票价格变化幅度达到5%时,系统将自动发送通知(包括新价格)给购买该股票的股民。现使用观察者模式设计该系统。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593358025972-70a6a606-8c1d-42f6-ac9a-617302e5041a.png#align=left&display=inline&height=321&margin=%5Bobject%20Object%5D&name=image.png&originHeight=321&originWidth=856&size=87285&status=done&style=none&width=856) ## 中介模式 (GUI界面组件) 某软件公司欲开发一套CRM系统,其中包含一个客户信息管理模块,所设计的“客户信息管理窗口”界面效果图如图所示。组件之间的交互关系如下: (1) 当用户单击“增加”按钮、“删除”按钮、“修改”按钮或“查询”按钮时,界面左侧的“客户选择组合框”、“客户列表”以及界面中的文本框将产生响应。 (2) 当用户通过“客户选择组合框”选中某个客户姓名时,“客户列表”和文本框将产生响应。 (3) 当用户通过“客户列表”选中某个客户姓名时,“客户选择组合框”和文本框将产生响应。 请使用中介模式实现该系统,并补充程序中相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593358055294-ab5e55a7-9b0e-4c44-b5a3-1aa2ffdefe2e.png#align=left&display=inline&height=271&margin=%5Bobject%20Object%5D&name=image.png&originHeight=490&originWidth=913&size=83675&status=done&style=none&width=505) ## 备忘录模式 (悔棋功能) 中国象棋软件,由于考虑到有些用户是“菜鸟”,经常不小心走错棋;还有些用户因为不习惯使用手指在手机屏幕上拖动棋子,常常出现操作失误,因此该中国象棋软件要提供“悔棋”功能,在用户走错棋或操作失误后可恢复到前一个步骤。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593358090888-56025398-8335-4063-8211-bdef8bd9881f.png#align=left&display=inline&height=256&margin=%5Bobject%20Object%5D&name=image.png&originHeight=466&originWidth=981&size=41541&status=done&style=none&width=538) ## 状态模式 (银行账户) 在某银行系统中,我们定义了账户的三种状态: (1) 如果账户中余额大于等于0,则账户的状态为绿色状态(GreenState),此时用户既可以向该账户存款也可以从该账户取款; (2) 如果账户中余额小于0,并且大于等于-1000,则账户的状态为黄色状态(YellowState),此时用户既可以向该账户存款也可以从该账户取款; (3) 如果账户中余额小于-1000,那么账户的状态为红色状态(RedState),此时用户只能向该账户存款,不能再从中取款; 现用状态模式来实现状态的转化问题,用户只需执行简单的存款和取款操作,系统根据余额数量自动转换到相应的状态。请根据类图编程实现该系统,并写出相应Java代码。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1556579/1593358117598-60080daa-60ed-4663-9cf4-ac0a4f1247f3.png#align=left&display=inline&height=255&margin=%5Bobject%20Object%5D&name=image.png&originHeight=440&originWidth=862&size=112900&status=done&style=none&width=499)