设计模式实验报告
- 格式:docx
- 大小:350.43 KB
- 文档页数:34
实验二设计模式上机实验二一、实验目的使用PowerDesigner和任意一种面向对象编程语言实现几种常用的设计模式,加深对这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,包括根据实例绘制相应的模式结构图、编写模式实现代码,运行并测试模式实例代码。
三、实验要求1. 正确无误绘制装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式的模式结构图;2. 使用任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,代码运行正确无误。
四、实验步骤1. 使用PowerDesigner绘制装饰模式结构图并用面向对象编程语言实现该模式;2. 使用PowerDesigner绘制外观模式结构图并用面向对象编程语言实现该模式;3. 使用PowerDesigner绘制代理模式结构图并用面向对象编程语言实现该模式;4. 使用PowerDesigner绘制职责链模式结构图并用面向对象编程语言实现该模式;5. 使用PowerDesigner绘制命令模式结构图并用面向对象编程语言实现该模式;6. 使用PowerDesigner绘制迭代器模式结构图并用面向对象编程语言实现该模式;7. 使用PowerDesigner绘制观察者模式结构图并用面向对象编程语言实现该模式;8. 使用PowerDesigner绘制状态模式结构图并用面向对象编程语言实现该模式;9. 使用PowerDesigner绘制策略模式结构图并用面向对象编程语言实现该模式;10. 使用PowerDesigner绘制模板方法模式结构图并用面向对象编程语言实现该模式。
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
设计模式⼤作业实验报告蛋糕订购系统⼀、实验介绍(3)⼆、实验环境(3)三、系统流程(3)四、系统总类图(4)五、程序源代码及各个模块⼦类图(5)六、程序运⾏截图(22)七、实验总结(22)⼀、实验介绍本系统使⽤了简单⼯⼚模式、⼯⼚⽅法模式、单例模式、门⾯模式、策略模式、观察者模式⼀共6种模式实现了从蛋糕店订购订购蛋糕的这样⼀个系统。
⼆、实验环境Windows操作系统、MyEclipse10.0、MySQL 5.5、jdk1.6三、系统流程四、系统总类图五、程序源代码及各个模块⼦类图(⼀)测试类Client.java:package net.xsl.ordercake.test;import net.xsl.ordercake.discount.DiscountStyleThree;import net.xsl.ordercake.discount.OrderCake;import net.xsl.ordercake.order.CakeShop;import net.xsl.ordercake.order.EastVilla;import net.xsl.ordercake.order.WestVilla;publicclass Client {publicstaticvoid main (String arg[]){CakeShop starCakeShop = CakeShop.getCakeShop();new WestVilla(starCakeShop, "草莓⽔果"); starCakeShop.getNewName("西13");starCakeShop.notifyCustomer();OrderCake cake = new OrderCake();System.out.println("今⽇促销⼀律8折优惠");cake.setM(8);cake.setStyle(new DiscountStyleThree());cake.setPrice(80) ;System.out.println("本次订购成功完成,需要⽀付的⾦额为"+cake.getMoney(cake.getPrice(),cake.getM())+",原价80"); System.out.println("================================="); new EastVilla(starCakeShop, "甜奶");starCakeShop.getNewName("东18");starCakeShop.notifyCustomer();System.out.println("================================="); starCakeShop.getNewName("东12");starCakeShop.notifyCustomer();}}(⼆)折扣的接⼝和⽅法(策略模式):a)接⼝DiscountStyle.java:package net.xsl.ordercake.discount;publicinterface DiscountStyle {publicdouble disCount(double price,double m);}b)折⽅式⼀DiscountStyleOne.java:package net.xsl.ordercake.discount;publicclass DiscountStyleOne implements DiscountStyle{ publicdouble disCount(double price,double m) {return price;}}c)打折⽅式⼆DiscountStyleTwo.java:package net.xsl.ordercake.discount;publicclass DiscountStyleTwo implements DiscountStyle{publicdouble disCount(double price,double m) {price = price - m;return price;}}d)打着⽅式三DiscountStyleThree.java:package net.xsl.ordercake.discount;publicclass DiscountStyleThree implements DiscountStyle{ publicdouble disCount(double price,double m) { price = price * m/10;return price;}}e)订蛋糕对象类,使⽤了get/set⽅法OrderCake.java:package net.xsl.ordercake.discount;publicclass OrderCake {double money,price;//money是打折后的最终价格,price是原价DiscountStyle style;double m;publicdouble getMoney(double price,double m){return style.disCount(price,m);}publicvoid setPrice(double price){this.price = price ;}publicdouble getPrice(){return price;}publicvoid setStyle(DiscountStyle style){this.style = style ;}public DiscountStyle getStyle(){return style;}publicvoid setM(double m){this.m = m ;}publicdouble getM(){return m;}}(三)顾客向蛋糕订购蛋糕(观察者模式),并在具体主题中使⽤了单例模式a)主题Shop.java:package net.xsl.ordercake.order;publicinterface Shop {publicvoid addCustomer(Customer o);publicvoid deleteCustomer(Customer o);publicvoid notifyCustomer();}b)具体主题(使⽤了单例模式,只能创建⼀个蛋糕商店的对象)CakeShop.java:package net.xsl.ordercake.order;import java.util.ArrayList;publicclass CakeShop implements Shop{String name;boolean changed;ArrayListpersonList;privateint i = 0;privatestatic CakeShop uniqueCakeShop;private CakeShop() {uniqueCakeShop = this;personList = new ArrayList();name = "";changed = false;}publicstaticsynchronized CakeShop getCakeShop(){if(uniqueCakeShop == null){uniqueCakeShop = new CakeShop();}return uniqueCakeShop;}publicvoid addCustomer(Customer o) { if(!(personList.contains(o))) personList.add(o);}publicvoid deleteCustomer(Customer o) { if((personList.contains(o))) personList.remove(o);}publicvoid notifyCustomer() {if(changed){try{Customer customer = personList.get(i); customer.orderCake(name);i++;changed = false;}catch(Exception e){System.out.println("没有新的订购信息"); }}}publicvoid getNewName(String str){if(str.equals(name))changed = false;else{name = str;changed = true;}}}c)观察者Customer.java:package net.xsl.ordercake.order;publicinterface Customer {publicvoid orderCake(String name);}d)体观察者⼀EastVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import /doc/1410101953.htmlkFactory;publicclass EastVilla implements Customer{Shop shop;private String cakeType;public EastVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}publicvoid orderCake(String name){System.out.println(name+"订了⼀个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')"; dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插⼊之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓⽔果") || cakeType.equals("葡萄⽔果")){MakeFruityCake eastVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = eastVilla.makeFruityCake();fruitCake.createCake();}elseif(cakeType.equals("⽜奶巧克⼒") || cakeType.equals("⿊巧克⼒")){MakeChocolateCake eastVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =eastVilla1.makeChocolateCake();chocolateCake.createCake();}elseif(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){ MakeMilkCake eastVilla1 = new MakeMilkCake(cakeType); MilkFactory milkCake = eastVilla1.makeMilkCake(); milkCake.createCake();}}}e)具体观察者⼆WestVilla.java:。
软件设计模式与体系结构实验报告在软件开发的世界里,设计模式和体系结构就像调味料,给整个开发过程增添了无限风味。
你知道的,写代码有时候就像做饭,少了调料,味道肯定不行。
先说说设计模式吧,这可真是个绝佳的主意。
想象一下,咱们每次做个项目的时候,脑袋里总是要有个框架,知道怎么来、怎么走,这时候设计模式就像一个好老师,教我们如何优雅地解决常见问题。
说到这里,大家听说过单例模式吗?这个模式就像是“独一无二”的存在,确保你在整个应用中只有一个实例,这样可避免浪费资源,避免重复。
嘿,你敢想象要是你的冰箱里塞满了牛奶,那可真是够烦人的。
再聊聊策略模式,真是聪明的家伙。
就好比你在吃火锅,想换个口味,可以随时调换蘸料,策略模式就是给你提供了这种灵活性。
无论是要排序、计算还是处理数据,你都可以轻松切换。
这就像在生活中,不同的情况要有不同的应对方式。
生活本来就充满变化,代码也是一样嘛。
想到这里,我觉得代码和生活一样,得学会随机应变。
然后说到观察者模式,这可是个有趣的故事。
想象一下,你在看球赛,朋友们都在旁边紧盯着屏幕,眼神不离。
这就是观察者模式的精髓:一个对象变化,所有观察它的人都立刻得到通知,哇,这个效率可真高。
就像你在朋友圈发了条动态,大家立刻围过来评论点赞,简直不要太快。
这种模式让我们在编程中也能保持同步,绝对是个“跟得上”的好帮手。
再说到体系结构,嘿,这可是大事儿。
体系结构就像大楼的蓝图,如果没有好的设计,后面的施工就容易出问题。
想想看,你有没有见过那些盖得歪歪扭扭的楼?那可真是惨不忍睹。
一个好的体系结构可以让整个系统稳定运行,避免后期的各种麻烦,就像一部精密的机器,每个部分都得协同工作。
分层架构、微服务架构,这些概念都是在告诉我们,要有条理,别让代码变成“杂货铺”。
说到微服务架构,这可真是个炫酷的概念。
就好像把大块头的火锅分成一个个小锅,你想吃啥就来啥,各种口味应有尽有。
这种架构让开发变得灵活,团队可以独立开发,互不影响。
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
设计模式之装饰模式实验报告第七组一、实验目的用java实现一个装饰模式,加深对装饰模式的理解。
二、实验内容在一个学校中,教师类ITeacher()具有教书方法teach()。
现需要动态给对象CTeacher ()添加J2EETeacher()方法。
使用装饰模式设计该系统,绘制类图并编程实现。
三、实验步骤实验步骤:(算法描述、源程序、操作步骤和方法)第一步:进入实验系统,创建Java 项目;第二步:按照实验指导书的内容,创建需要的各个类;第三步;编写每一个类的代码;第四步:对自己创建的Java项目进行调试;Java代码:ITeacher,javapackage ;public interface ITeacher {public void teach();}ITeacher.javapackage ;public class CTeacher implements ITeacher {ITeacher teacher;public CTeacher(){}public CTeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教C++");//this.teacher.teach();}}J2EETeacher.javapackage ;public class J2EETeacher implements ITeacher { ITeacher teacher;public J2EETeacher(){}public J2EETeacher(ITeacher teacher){this.teacher = teacher;}@Overridepublic void teach() {System.out.println("我能教J2EE");this.teacher.teach();}}Client.javapackage ;public class Client {public static void main(String[] args) { CTeacher c = new CTeacher();J2EETeacher cj = new J2EETeacher(c);cj.teach();}}四、运行结果五、类图。
实验1 UML实验(1)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.学会安装和使用建模工具Po werDesi gner,熟练使用PowerDesi gner绘制常用的UML图形,熟悉常用的UM L符号;2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵;3. 绘制状态图描述对象的状态及转换。
二、实验内容1. 某酒店订房系统描述如下:(1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订;(2) 前台服务员可以利用系统直接在前台预订房间;(3) 不管采用哪种预订方式,都需要在预订时支付相应订金;(4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付;(5) 利用信用卡进行支付时需要和信用卡系统进行通信;(6) 客房部经理可以随时查看客房预订情况和每日收款情况。
绘制该酒店订房系统的用例图。
2. 根据以下场景绘制用例图:某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteri a Orderin g System),企业员工可通过企业内联网使用该系统。
该系统功能描述如下:(1) 企业的任何员工都可以查看菜单和今日特价;(2) 系统的顾客是注册到系统的员工,可以在线订餐(以下操作均需先登录)、注册工资支付、修改订餐信息和删除订餐信息,在注册工资支付时需要通过工资系统进行身份验证;(3) 餐厅员工是特殊的顾客,可以进行备餐(系统记录备餐信息)、生成付费请求和请求送餐,其中对于注册使用工资支付的顾客生成付费请求并发送给工资系统;(4) 菜单管理员是餐厅员工的一种,可以管理菜单;(5) 送餐员也是餐厅员工的一种,可以打印送餐说明、记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
淮海工学院计算机工程学院实验报告书
课程名:《UML理论及实践》
题目:正向工程
班级:Z计121
学号:2014140093
姓名:薛慧君
一、目的与要求
1、熟悉面向对象原则,熟悉GoF中的模式;
2、会初步使用设计模式解决实际问题;
3、掌握正向工程、逆向工程概念;
4、掌握使用Rose画出类图、交互图等来描述设计模型;
5、掌握使用Rose从设计模型使用正向工程,得到代码框架;
6、掌握使用Rose从代码使用逆向工程,得到设计模型,并文档化Project。
二、实验内容或题目
假设有一CAD系统,可能需要绘制处理若干图形(如矩形、圆形、三角形……);而画图程序有若干版本,画图的工作需要依赖于具体的机器型号,新机器可以使用新的画图程序,旧的机器只能使用老版本的程序,请使用桥模式为本系统设计一个方案:请在Rational Rose中给出设计类图,并使用正向工程生成代码框架;在生成的代码中修改后再使用逆向工程,重新生成设计模型。
三、实验步骤及结果
CAD系统设计模型的类图;
四、结果分析与实验体会
通过本次实验,我掌握了:
(1)桥模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
(2)桥模式适用性:①不希望在抽象和实现部分之间有一个固定的绑架关系②类的抽象以及实现都可以通过生成子类的方法加以扩充③对抽象的实现部分的修改应不会对客户产
生影响④对客户完全隐藏抽象的实现⑤有许多类要生成⑥在多个对象间共享实现,同时对客户隐藏这种实现机制
(3)桥模式实现要点:分别定义抽象的接口和实现的接口,抽象接口中聚合一个实现接口的引用,该引用就是连接接口和实现的桥梁。
实验二:工厂模式实验内容简单工厂方法模式:利用简单工厂方法模式创建pad, phone, watch的对象,并使用这些对象娱乐。
工厂模式:利用工厂模式创建pad, phone, watch的对象,并使用这些对象娱乐。
抽象工厂模式:利用抽象工厂模式创建华为、小米、苹果的pad, phone, watch的对象,并使用这些对象娱乐。
简单工厂方法模式设计图1简单工厂模式类图核心代码ConsumerElectronics.java核心代码Pad.java核心代码Watch.java核心代码Phone.java核心代码ConsumerElectronicsFactory.java核心代码实现效果图 2 简单工厂模式实现效果图工厂模式设计图 3 工厂模式类图核心代码ConsumerElectronicsFactory.java核心代码PadFactory.java核心代码WatchFactory.java核心代码PhoneFactory.java核心代码实现效果图4 工厂模式实现效果图抽象工厂模式设计图5抽象工厂模式类图核心代码AbstractFactory.java核心代码AppleFactory.java核心代码HuaweiFactory.java核心代码MiFactory.java核心代码实现效果图 6 抽象工厂模式实现效果图实验体会做完这次试验,下面是我的一些体会:首先,工厂模式是为了解耦:把对象的创建和使用的过程分开。
其次,工厂模式可以降低代码重复。
如果创建对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
我们可以这些创建对象的代码放到工厂里统一管理。
既减少了重复代码,也方便以后对该对象的创建过程的修改维护。
由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要逐个修正,只需要在工厂里修改即可,降低维护成本。
另外,因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
一、实验名称【实验名称】二、实验目的1. 熟悉【实验目的1】。
2. 掌握【实验目的2】。
3. 了解【实验目的3】。
三、实验原理【实验原理简介】四、实验仪器与材料1. 仪器:- 【仪器1】- 【仪器2】- 【仪器3】- ...2. 材料:- 【材料1】- 【材料2】- 【材料3】- ...五、实验方法与步骤1. 实验方法【简要描述实验方法】2. 实验步骤1) 准备工作:- 【步骤1】- 【步骤2】- 【步骤3】- ...2) 实验操作:- 【步骤4】- 【步骤5】- 【步骤6】- ...3) 数据记录与分析:- 【步骤7】- 【步骤8】- 【步骤9】- ...六、实验数据记录与分析1. 实验数据记录【在此处记录实验过程中观察到的数据,如表格、图表等形式】2. 数据分析【根据实验数据进行分析,包括但不限于以下内容】- 对比实验前后数据的变化- 分析实验结果与预期目标的关系- 探讨实验中可能存在的问题及原因七、实验结果与讨论1. 实验结果【在此处描述实验结果,包括但不限于以下内容】- 实验现象描述- 数据分析结果- 与预期目标的一致性2. 讨论【对实验结果进行讨论,包括但不限于以下内容】- 分析实验结果背后的原理- 探讨实验过程中遇到的问题及解决方法- 对实验结果的进一步分析及改进建议八、实验结论【总结实验结果,得出实验结论】九、实验心得与体会【总结实验过程中的收获与体会,包括但不限于以下内容】- 对实验原理和方法的深入理解- 实验操作技能的提升- 团队合作的重要性- 实验过程中遇到的问题及解决策略十、参考文献【列出实验过程中参考的文献】【注】以上模板仅供参考,具体实验报告内容需根据实际实验情况进行调整。
实验二 设计模式实验一一、实验目的熟练使用面向对象设计原则对系统进行重构;熟练使用PowerDesigner 和任意一种面向对象编程语言实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用面向对象设计原则对系统进行重构;使用PowerDesigner 和任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式,包括根据实例绘制模式结构图、编写模式实例模拟实现代码,运行并测试所编写代码。
(1) 面向对象设计原则在某图形库API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如Circle 、Triangle 等)的init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复Circle+++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Triangle +++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Rectangle+++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Client杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:①隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;②客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
(2) 简单工厂模式使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个UnsupportedShapeException 异常,绘制类图并编程模拟实现。
(3) 工厂方法模式现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。
图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactory和JpgReaderFactory用于创建具体的图片读取器对象。
试使用工厂方法模式设计该程序,绘制类图并编程模拟实现。
(4) 抽象工厂模式某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。
不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。
试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。
(5) 单例模式使用单例模式的思想实现多例模式,确保系统中某个类的对象只能存在有限个,例如两个或三个,设计并编写代码实现一个多例类。
(6) 单例模式使用单例模式设计一个多文档窗口(注:在Java AWT/Swing开发中可使用JDesktopPane 和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。
(注:用C#或C++实现类似功能也可以)(7) 适配器模式现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch (int[], int)方法实现了二分查找算法。
现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。
绘制类图并编程实现。
(要求实现快速排序和二分查找)(8) 适配器模式Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。
现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?选择一种合适的设计模式,绘制类图并编程模拟实现。
(9) 桥接模式某软件公司欲开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、Unix等多个操作系统上运行。
系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。
系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。
试使用桥接模式设计该跨平台图像浏览系统,绘制类图并编程模拟实现。
(10) 组合模式某教育机构组织结构如下图所示:在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
三、实验要求1. 选择合适的面向对象设计原则对系统进行重构,正确无误绘制重构之后的类图;2. 正确无误绘制简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式实例的模式结构图;3. 使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式实例,代码运行正确无误。
四、实验步骤1. 选择合适的面向对象设计原则对系统进行重构,使用PowerDesigner绘制重构之后的类图;2. 使用PowerDesigner绘制简单工厂模式实例结构图并用面向对象编程语言实现该模式实例;3. 使用PowerDesigner绘制工厂方法模式实例结构图并用面向对象编程语言实现该模式实例;4. 使用PowerDesigner绘制抽象工厂模式实例结构图并用面向对象编程语言实现该模式实例;5. 使用PowerDesigner绘制单例模式实例结构图并用面向对象编程语言实现该模式实例;6. 使用PowerDesigner绘制适配器模式结构图并用面向对象编程语言实现该模式;7. 使用PowerDesigner绘制桥接模式结构图并用面向对象编程语言实现该模式;8. 使用PowerDesigner绘制组合模式结构图并用面向对象编程语言实现该模式。
五、实验报告要求1. 提供重构之后的类图,简要说明重构过程中所运用的面向对象设计原则;2. 提供简单工厂模式实例结构图及实现代码;3. 提供工厂方法模式实例结构图及实现代码;4. 提供抽象工厂模式实例结构图及实现代码;5. 提供单例模式实例结构图及实现代码;6. 提供适配器模式实例结构图及实现代码;7. 提供桥接模式实例结构图及实现代码;8. 提供组合模式实例结构图及实现代码;9. 注意调整类图中文字的字体及字号,注意图的整体布局和图的大小,避免使用交叉线,注意代码字体和颜色,代码字体需一致,颜色需统一;10. 认真写好实验总结;11. 提交电子版实验报告,格式为“学号-姓名-实验2.doc”,如“060102-张三-实验2.doc”,所有材料(包括类图和源代码)均放在一个Word文件中,格式为doc或docx,不需要提交PowerDeigner所保存的oom模型,也无须单独提交源代码。
六、实验结果1. 重构之后的类图:ClientTriangleFactory+produceShape () ...: ShapeShapeFactory+produceShape () ...: ShapeShape+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidCircle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidTraingle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidRectangle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: void CircleFactory+produceShape ()...: ShapeRectangleFactory+produceShape ()...: Shape重构过程中所使用的面向对象设计原则及简要说明:1).重构之后实现了开闭原则:在增加一个新图形时,只需要增加一个新图形类和一个新图形的工厂类,然后将新图形的工厂类放入配置文件,从而使增加新图形时不用修改源代码,完全符合“开闭原则”;2).还实现了单一职责原则:原先的客户端类,需要创建具体的用户对象,承担了过多的职责,重构之后的客户端只需要创建抽象工厂,由具体的图形工厂创建具体的图形对象,实现了单一职责原则;3).另外还实现了依赖倒转原则:客户端完全只针对抽象编程,没有依赖于具体的细节,只需要针对ShapeFactory和Shape编程;2. 类图:Shape+ +Draw ()Erase ()...: void: voidCircle+ +Draw ()Erase ()...: void: voidTriangle++Draw ()Erase ()...: void: voidRectangle++Draw ()Erase ()...: void: voidShapeFactory+produceShape (String arg)...: ShapeClient实现代码:3. 类图:实现代码:<<create>><<create>>ImageReader+readImage ()...: void JifReader+readImage ()...: void JpgReader+readImage ()...: void JifReaderFactory+produceImageReader ()...: ImageReader JpgReaderFactory+produceImageReader ()...: ImageReader ClientImageReaderFactory+produceImageReader ()...: ImageReader4. 类图:实现代码:ClientSkinFactory+++createButton ()createText ()createCombox ()...: AbstractButton : AbstractText : AbstractCombox AbstractButton+action ()...: void SpringSkinFactory+++createButton ()createText ()createCombox ()...: AbstractButton : AbstractText : AbstractCombox SummerSkinFactory+++createButton ()createText ()createCombox ()...: AbstractButton : AbstractText : AbstractCombox AbstractText+action ()...: void GreenButton+action ()...: void GreenText+action ()...: void GreenCombox+action ()...: void BlueButton+action ()...: void BlueText+action ()...: void BlueCombox+action ()...: void AbstractCombox+action ()...: void5. 类图:实现代码: Printer--instance1instance2: Printer : Printer = null = null -+Nationality ()getInstance ()...: Printer Client6. 类图:实现代码:JInternalFrame--internalFramedesktopPane: JInternalFrame: JDesktopPane+actionPerformed ()...: JInternalFrameClient7. 类图:实现代码:DataOperation++sort (int int[])search (int int[], int no): void : intQuickSort+quickSort (int int[])...: void BinarySearch+binarySearch (int int[], int no)...: int QBAdapter--bsearch quicksort : BinarySearch : QuickSort ++sort (int int[])search (int int[], int no): void : intClient8. 类图:实现代码:Player+playMedia (File fileName)...: void WindowsMediaPlayerAdapter-windowsMediaPalyer: WindowsMediaPlayer +playMedia (File fileName)...: voidWindowsMediaPlayer+play (File fileName) ...: voidRealPlayer+play (File fileName)...: voidRealPlayerAdapter-realPlayer: RealPlayer+playMedia (File fileName)...: voidClient9. 类图:ImageBrowsingSystem{abstract}-image: Image+ +paintImage ()setImage ()...: void: voidBMPImage+parseImage ()...: voidJPGImage+parseImage ()...: voidGIFImage+parseImage ()...: voidPNGImage+parseImage ()...: voidWindowsSystem+paintImage (): voidLinuxSysgtem+paintImage (): voidUnixSystem+paintImage (): voidImage+parseImage ()...: voidClient实现代码:10.类图:实现代码:AbstractHead{abstract}+receiveDocument (): voidBranch--list branchName : ArrayList : string ++++issuedDocument ()addSubOrg (AbstractHead element)removeSubOrg (AbstractHead element)receiveDocument (): void : void : void : intAdminOffice-officeName : string +receiveDocument ()...: void ProvostOffice-officeName : string +receiveDocument ()...: void Client七、实验总结这次试验,让我充分了解了和掌握了创建型设计模式和结构型模式的设计方法。