设计模式实验五
实验五 工厂方法模式、抽象工厂模式和生成器模式
实验五工厂方法模式、抽象工厂模式和生成器模式的应用一、实验目的通过该实验,理解工厂方法模式、抽象工厂模式和生成器模式的意图、结构,在软件开发中使用这些模式并进行功能验证。
二、实验内容1.手机工厂:现实中不同品牌的手机应由不同的工厂制造,使用工厂方法模式模拟实现。
图1 手机工厂的类图2.微型计算机配件的生产:该系统所需要的产品族有两个:PC系列和MAC系列,产品等级结构也有两个:RAM和CPU,使用抽象工厂模式模拟实现。
图2 微型计算机配件生产系统的设计类图3.用程序画一个小人:要求小人要有头、身体、手和脚。
使用生成器模式模拟实现。
图3 利用程序画小人的类图三、实验步骤与要求1.对于以上题目要认真分析和理解题意,程序中要求使用相应的模式。
2.上机录入,使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:1、工厂方法模式当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,可以使用工厂方法模式来设计系统。
工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
适合使用工厂方法模式的情景有:●用户需要一个类的子类的实例,但不希望与该类的子类形成耦合●用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。
工厂方法模式的UML类图:图4 工厂方法模式的类图2、抽象工厂模式当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂模式来设计系统。
抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
适合使用抽象工厂模式的情景有:●系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类解耦。
设计模式实验报告总结(3篇)
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
《设计模式》实验指导书
《设计模式》实验指导书软件学院前言随着面向对象技术的发展和广泛的应用,设计模式已成为面向对象开发人员的必备技能之一。
无论是面向对象的初学者还是具有一定开发经验的程序员,都可以通过对设计模式的学习和应用加深对面向对象思想的理解,开发出具有更好的可扩展性和复用性的软件。
本实验指导书通过项目实例让学生加深对设计模式的理解,在学习设计模式的同时掌握如何在实际软件开发中运用模式,强化对设计模式的理解和掌握。
实验一:创建型模式设计一、实验目的、以本实验指导中给定的实验模式为实验实例,掌握五类“创建型模式”的工作原理和应用环境。
、掌握工厂方法模式()、抽象工厂模式()、建造者模式()、原型模式()、单例模式()等五类“创建型模式”的实验过程。
二、实验原理、创建型模式的工作原理创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
创建型模式分为:工厂方法模式()、抽象工厂模式()、建造者模式()、原型模式()、单例模式()等五类。
、模式的工作原理工厂方法模式():也叫虚拟构造器()模式或者多态工厂()模式,在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。
它的类图如下:工厂方法模式包含如下角色:✓:抽象产品✓:具体产品✓:抽象工厂✓:具体工厂模式的特点为当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。
、抽象工厂模式()、建造者模式()、原型模式()、单例模式()的工作原理应通过教材复习。
三、实验内容. 某系统提供一个简单计算器,具有简单的加、减、乘、除法的功能,系统可以根据用户的选择实例化相应的操作类。
现使用简单工厂模式设计该系统。
类图如下:、对于上述问题修改为工厂方法模式,给定的类图如下所示:、某系统为了改进数据库操作的性能,自定义数据库连接对象和语句对象,可针对不同类型的数据库提供不同的连接对象和语句对象,如提供或专用连接类和语句类,而且用户可以通过主函数方式根据实际需要动态更换系统数据库。
【精品实验报告】软件体系结构设计模式实验报告
【精品实验报告】软件体系结构设计模式实验报告软件体系结构设计模式实验报告学生姓名: 所在学院: 学生学号: 学生班级: 指导老师: 完成日期:一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括组合模式、外观模式、代理模式、观察者模式和策略模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现组合模式、外观模式、代理模式、观察者模式和策略模式,包括根据实例绘制模式结构图、编写模式实例实现代码,运行并测试模式实例代码。
(1) 组合模式使用组合模式设计一个杀毒软件(AntiVirus)的框架,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒,文件种类包括文本文件TextFile、图片文件ImageFile、视频文件VideoFile。
绘制类图并编程模拟实现。
(2) 组合模式某教育机构组织结构如下图所示:北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
(注:可以定义一个办公室类为抽象叶子构件类,再将教务办公室和行政办公室作为其子类;可以定义一个教学机构类为抽象容器构件类,将总部、分校和教学点作为其子类。
)(3) 外观模式某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件、加密、保存加密之后的文件。
读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。
现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块,要求编程模拟实现。
设计模式实验报告范文
《设计模式》实验指导书10学时*师:**实验一工厂模式的应用【实验目的】1) 掌握工厂模式(Factory)的特点2) 分析具体问题,使用工厂模式进行设计。
【实验内容和要求】有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。
利用工厂模式改善设计,用C#控制台应用程序实现该OEM制造商的工厂模式。
绘制该模式的UML图。
【模式UML图】【模式代码(JA V A语言实现)】public class FactoryMethod {public static void main(String[] args) {Computer c;Factory f=new DellFactory();c=f.getComputerType();puterType();f=new LenovoFactory();puterType();f=new AcerFactory();c=f.getComputerType();puterType();}}interface Factory{Computer getComputerType();}class DellFactory implements Factory{ @Overridepublic Computer getComputerType() {return new Dell();}}class AcerFactory implements Factory{ @Overridepublic Computer getComputerType() {return new Acer();}}class LenovoFactory implements Factory{ @Overridepublic Computer getComputerType() {return new Lenovo();}}/*** 电脑品牌*/interface Computer{public void ComputerType();}class Dell implements Computer{@Overridepublic void ComputerType() {// TODO Auto-generated method stubSystem.out.println("Dell Computer");}}class Acer implements Computer{@OverrideSystem.out.println("Acer Computer");}}class Lenovo implements Computer{@Overridepublic void ComputerType() {// TODO Auto-generated method stubSystem.out.println("Lenovo Computer");}}【运行截图】【实验小结】通过本次实验,学会了使用工厂方法模式。
软件设计模式实验
选择一种较合适的设计模式,结合以下场景绘制出相应的类图并编码实现一、如有个国家的运动员协会,他们是负责登记与注册职业运动员的(如同我们国家的体育总局,无论是足球篮球还是乒乓球的运动员都必须在这里注册才能拿到我们国家职业运动员牌照)。
一家体育俱乐部若(比如篮球的广东宏远,足球的深圳健力宝)想获得球员为自己俱乐部效力,就必须通过这个运动员协会。
Sports接口:public interface Sports {public void run();public void jump();}乒乓球:public class PP implements Sports{public void run(){System.out.println("乒乓球跑");}public void jump(){System.out.println("乒乓球跳");}}篮球:public class BB implements Sports{public void run(){System.out.println("篮球跑");}public void jump(){System.out.println("篮球跳");}}协会:public class Association {public static Sports registerPP(){return new PP();}public static Sports registerBB(){return new BB();}}俱乐部:public class Club {private Sports shou;private Sports hou;private Sports qian;public static void main(String[] args) {Club lu = new Club();lu.qian=Association.registerBB();lu.hou=Association.registerBB();lu.shou=Association.registerBB();lu.hou.run();lu.qian.jump();Club lu1 = new Club();lu1.qian=Association.registerPP();lu1.hou=Association.registerPP();lu1.shou=Association.registerPP();lu1.hou.run();lu1.qian.jump();}}二、一家灯工厂,拥有两条生产线,这个工厂能同时造灯泡和灯管,若客户需要买灯,只需要和销售部联系进行购买即可。
五水平设计方法
五水平设计方法五水平设计方法是一种实验设计方法,主要用于心理学、社会学和经济学等领域的实验研究。
这种方法将实验对象分成五个水平,每个水平代表一个不同的处理或条件,以便比较和分析。
具体而言,五水平设计方法包括以下步骤:1. 确定实验目的和变量:在开始实验之前,必须明确实验的目的和研究变量。
这些变量可以是自变量、因变量或控制变量。
2. 确定实验水平:根据实验目的和研究变量的性质,将实验对象分成五个不同的水平或条件。
这些水平应该具有代表性,并且能够提供足够的信息来回答研究问题。
3. 分配实验对象:将实验对象随机分配到五个不同的水平中。
为了确保实验的公正性和准确性,应该采用随机分配的方法,以确保每个水平中的实验对象具有相似的特征和背景。
4. 实施实验:根据实验设计,对实验对象进行相应的处理或操作。
这些处理或操作可以是不同的刺激、任务或情境,以观察它们对实验结果的影响。
5. 收集数据:在实验过程中,记录每个实验对象的表现和反应,并收集相关数据。
这些数据可以是问卷调查、行为观察、生理指标等。
6. 分析数据:对收集到的数据进行统计分析,比较不同水平之间的差异,并探索变量之间的关系。
常用的统计方法包括描述性统计、方差分析、回归分析等。
7. 解释结果:根据统计分析的结果,解释实验的目的和研究问题,并得出结论。
如果结果与预期不符,可以尝试重新设计实验或分析可能的原因。
五水平设计方法具有以下优点:1. 对比性强:由于有五个不同的水平,可以更全面地比较不同处理或条件之间的差异,提高研究的对比性。
2. 信息量大:由于包括五个水平,可以收集更多的数据和信息,提高研究的准确性和可靠性。
3. 控制效果好:通过随机分配实验对象到不同水平,可以更好地控制无关变量的影响,提高研究的内部效度。
然而,五水平设计方法也存在一些缺点:1. 实施难度大:由于包括五个不同的水平,需要更多的实验材料、时间和资源,实施起来较为困难。
2. 数据处理复杂:由于数据量较大,需要使用复杂的统计分析方法来处理和解释数据。
第五章 实验设计讲解
优点:能较好控制“成熟”因素、降低历史因素对内部效度的影响,可控
制测验因素的干扰,有时能控制统计回归的因素;
缺点:不能控制与实验处理同时发生的偶发事件的影响,不能排除与自变
量同时出现的附加变量的影响,不易控制测验与实验处理的交互作用,多
次施测可能降低或增加被试对实验处理的敏感性。
X
980
A
780
B
C
(二)实验组控制组后测设计
1.设计模式 2.数据统计检验 3.
1.设计模式
R1
X
O1
R2
-
O2
注意:独立样本T检验来进行差异判断。
差异?
例:观看暴力电视对攻击行为的影响.
实验组儿童 控制组儿童
看暴力电 视 -
攻击次 数 攻击 次数
差异?
2.数据的统计检验
独立样本平均数的t-检验:?O1 = O2 曼-惠特尼(Mann-Whitney)U-检验 或 中位数检 验(非参数检验)
被试内设计 被试间素与水平
因素:自变量, 可以是刺激变量,也可以是被试变量 水平:因素的特定值称为“水平”或称为“处理”
水平结合
一个因素的某一水平与另一因素的某一水平的结合,成为一个水平结 合,或者一个处理结合 例如:噪声强度两个水平:40分贝(A1)、60分贝(A2); 任务难度两个水平:高(B1)、低(B2) 包含的实验处理有2×2=4
3、三种分配区组被试的方式:
A、一名被试作为一个区组重复接受H种处理,即重复测量设计
B、采用配对法,把在某些特性相同的H个(或H的倍数)被试加 以配对,这时每个配对组为一个区组,H个被试随机分配到H个处 理中 C、区组内的基本单元是一个团体或一个子集,如一个年级为一 个区组,用随机分配的方法给予每个班的实验处理方面
(完整版)设计模式实验三
实验3 创建型设计模式实验实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.熟练使用面向对象设计原则对系统进行重构;2.熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的创建型设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式和单例模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容1.在某图形库API中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:Circle+ + + + +init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidTriangle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidRectangle+++++init ()setColor ()fill ()setSize ()display ()...: void: void: void: void: voidClient在该图形库中,每个图形类(如Circle、Triangle等)的init()方法用于初始化所创建的图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:①由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;②在图形库中增加并使用新的图形时需要修改客户类源代码;③客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
设计模式实验报告
预备实验UML建模实验目的:加深对UML建模的理解实验环境:MyEclipse(Java)或Rational Rose等实验内容:1、需求描述A.某学校准备开发一套选课管理系统,其主要用户是教师和学生。
假设教师可以查看课程、增加课程和修改课程;学生可以选修一门或多门课程(为简化起见,学生选修某课程后不允许修改和删除),还能够查看所选修课程的成绩。
其中:课程可由课程编号、课程名称进行描述;教师可用工号和姓名进行描述;学生可用学号、姓名进行描述。
B. 某信用卡系统账户具有使用状态和冻结状态,其中使用状态又包括正常状态和透支状态两种子状态。
如果账户余额小于零则进入透支状态,透支状态时既可以存款又可以取款,但是透支金额不能超过5000元;如果余额大于零则进入正常状态,正常状态时既可以存款又可以取款;如果连续透支100天,则进入冻结状态,冻结状态下既不能存款又不能取款,必须要求银行工作人员解冻。
用户可以在使用状态或冻结状态下请求注销账户。
根据上述要求,绘制账户类的状态图。
2、用例图根据上面的需求描述A,运用UML画出用例图。
画图中的用例名和参与者均用中文表示;3、类图根据上面的需求描述A,运用UML画出初始设计类图(仅含业务类),图中应给出属性和方法的中文名称,类与类之间若存在关联,可不确定关联的方向,但需要标出这些关联的多重性。
4、状态图根据上面的需求描述B,运用UML画出状态图实验2 单一职责原则训练实验目的:加深对单一职责原则的理解实验环境:C#.Net/VC++.Net或MyEclipse(Java)等实验内容:1、实例说明某基于Java的C/S系统的“登录功能”通过如下登录类(Login)实现:现使用单一职责原则对其进行重构,并编程实现(可仿真实现数据数据库DAO 形式,当然如果能实现真实的数据库连接并进行数据库的操纵更好)。
package Experiment_One_Code;import java.sql.*;/**** @author Author**/public class DBUtil {public static Connection getConnction() {Connection dbConnection = null;try {Class.forName(DRIVER_CLASS);dbConnection = DriverManager.getConnection(DATABASE_URL,DATABASE_USRE, DATABASE_PASSWORD);} catch (Exception e) {e.printStackTrace();}return dbConnection;}}package Experiment_One_Code;/**** @author Author**/public class UserDAO {private DBUtil db = new DBUtil();private String userName;private String userPassword;public boolean findUser(String userName, String userPassword) { return false;}}package Experiment_One_Code;/**** @author Author**/public class LoginForm {public LoginForm(UserDAO dao) {super();this.dao = dao;}public LoginForm() {super();}UserDAO dao = new UserDAO();public void init() {}public void display() {}public void validate() {}}package Experiment_One_Code;/**** @author Author**/public class MainClass {public static void main(String[] args) { // TODO Auto-generated method stubLoginForm loginForm = new LoginForm();loginForm.init();loginForm.display();loginForm.validate();}}2、实例说明某图形处理系统通过如下类实现:package compute.area_circle.HKT;/**** @author Author1* @date 2019-04-02 上午11:26:41* 正方形类*/public class squareClass {public void Draw() {System.out.println("画一个正方形!");}public void Area() {System.out.println("计算正方形的面积!");}}package compute.area_circle.HKT;/**** @author Author1* @date 2019-04-02 上午11:49:50**/public class figure_Draw_Program {public static void main(String[] args) { // TODO Auto-generated method stubsquareClass square1 = new squareClass();square1.Draw();}}package compute.area_circle.HKT;/*** @author Author1* @date 2019-04-02 上午11:38:47**/public class figure_Compute_Program { /*** @param args*/public static void main(String[] args) { // TODO Auto-generated method stubsquareClass square = new squareClass();square.Area();}}现使用单一职责原则对其进行重构。
最经典的设计模式实验报告
设计模式实验报告(一)课程名称: ___设计模式__ _实验名称:__创建型与结构型模式专业: 计算机科学与技术学号:姓名:实验日期:2012.4.09工厂模式一、实验目的:1、学习工厂模式设计2、学习抽象工厂模式设计3、学习建造者模式设计4、学习单例模式二、运行环境:Microsoft Visual Studio 2010三、实验内容1、工厂模式模式定义:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
实例说明:为了让增加新品牌电视机更加方便,可以通过工厂方法模式对该电视机厂进行进一步重构。
可以将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海型电视机,如果需要生产TCL电视机,只需要对应增加一个新的TCL工厂即可,原有的工厂无需做任何修改,使得整个系统具有更好的灵活性和可扩展性。
①源代码:Class1:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace工厂模式?{public interface TV{void play();}public class HaierTV : TV{public void play(){MessageBox.Show("海£尔?电?视酣?播¥放?中D");}}public class HisenseTV : TV{public void play(){MessageBox.Show("海£信?电?视酣?播¥放?中D");}}public interface TVFactory{TV produceTV();}public class HaierTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£尔?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HaierTV();}}public class HisenseTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£信?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HisenseTV();}}class Class1{}}Form1.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace工¤厂§模£式?{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HaierTVFactory (); //唯¨一?不?一?样ù的?地?方?tv=factory.produceTV ();tv .play ();}private void button2_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HisenseTVFactory(); //唯¨一?不?一?样ù的?地?方?tv = factory.produceTV();tv.play();}}}②运行结果:主界面:点击“海尔电视”按钮后:再点击“确定”后:点击“海信电视”按钮后:点击“确定”按钮后:2、抽象工厂模式模式定义:提供一个创建一系列相关或相互依赖对象的接口,且无需指定他们具体的类。
实验设计模式及举例
实验设计模式及举例一、实验设计模式概述实验设计是科学研究中的重要环节,它决定了研究的有效性和可靠性。
实验设计模式是指在进行实验设计时所采用的一种标准化的、规范化的方法。
根据实验变量的不同,可以将实验设计模式分为三种:组间设计、组内设计和混合设计。
每种设计模式都有其特点和应用场景,选择合适的实验设计模式对于实验结果的准确性和可靠性至关重要。
二、组间设计1.定义:组间设计是指将参与者随机分配到不同的实验组,每个组接受不同的实验处理,以比较不同处理之间的差异。
2.优点:组间设计可以减少个体差异对实验结果的影响,因为每个参与者只接受一种处理方式。
此外,由于每个参与者只接受一种处理方式,因此不存在顺序效应或疲劳效应等问题。
3.缺点:组间设计需要更多的参与者,因为每个参与者只能接受一种处理方式。
此外,如果实验组之间的个体差异较大,可能会导致实验结果的不准确。
4.举例:在一个研究不同运动方式对心肺功能的影响的实验中,可以将参与者随机分为两组,一组进行有氧运动,另一组进行力量训练。
通过比较两组之间的心肺功能指标,可以评估不同运动方式对心肺功能的影响。
三、组内设计1.定义:组内设计是指将参与者按照某种顺序接受不同的实验处理,以比较不同处理之间的差异。
2.优点:组内设计可以减少参与者数量,因为每个参与者可以接受多种处理方式。
此外,由于参与者可以接受多种处理方式,因此可以更好地探究自变量之间的交互作用。
3.缺点:组内设计容易受到顺序效应和疲劳效应的影响。
如果实验处理之间的顺序不同,可能会导致实验结果的不准确。
此外,如果参与者感到疲劳,可能会影响实验结果的可靠性。
4.举例:在一个研究不同食物对血糖水平的影响的实验中,可以让同一个参与者在一天之内分别食用高糖食物和低糖食物,然后比较两种食物对血糖水平的影响。
由于所有参与者都是在同一时间内进行实验的,因此可以控制时间因素对血糖水平的影响。
四、混合设计1.定义:混合设计是指将组间设计和组内设计结合使用的一种实验设计方法。
eprime
E E--Prime 实验设计种按心理实验程序的结构和核心实验过程设计的复杂性,可把心理实验程序归属以下五种模式进行设计: 一是单一模式(Baisic),二是并联模式(Paralleling),三串联模式(Series),四是平衡模式(CounterBalance),五是相嵌模式(Nesting)。
各种模式的结构图如图7.1所示。
图7.1-1为单一模式实验设计,图7.1-2为并联模式实验设计,图7.1-3为串联模式实验设计,图7.1-4为平衡模式实验设计,图7.1-5为相嵌模式实验设计。
图7.7.1 E 1 E 1 E--Prime 实验设计的五种模式实验设计的五种模式这里所说的心理实验程序的结构和核心实验过程设计的复杂性,是基于实验中包含的存储实验材料及相关控制的List 的结构关系和核心实验过程CEP (Core Experimental Procedure)的多少而言。
并将实验中包含的List 的结构关系将心理学的实验程序划分为上述五种模式进行设计。
并且这里所说的“复杂性”,纯针对正式实验模块而言,不包括练习模块。
下面我们重点讲述各种模式的实验设计。
第一节第一节 单一模式与并联模式单一模式与并联模式单一模式与并联模式一、 单一模式单一模式1.模型结构模型结构单一模式是最为简单的心理实验设计模式,如上图7.2所示。
单一模式由一个存储实验材料及相关控制的List 和一个核心实验过程CEP 组成。
从图7.1中可以看出,其余四种模式中都包含了单一模式的模型。
7.1-1 7.1-2 7.1-3 7.1-4 7.1-5 图例:I -指导语,E -结语界面, 表格List 为实验材料及相关控制,CEP 为核心实验过程,空白框为各界面2.典型实验典型实验如词汇判断的实验、典型的Stroop 效应实验,启动效应实验都是典型的单一模式的实验设计。
3.实验设计实验设计我们在第三章讲E-Prime 的实验设计时,所举得“词汇判断”实验就是单一模式的实验设计,具体的设计过程这里就不再熬述,而且,单一模式的实验设计也是难度最低的实验设计。
(完整版)设计模式实验三
图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂
ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器
时无须直接创建图形对象,甚至不需要关心具体图形类类名;
②客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭
原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
2.使用简单工厂模式设计一个可以创建不同几何形状
(Shape),如圆形(Circle)、矩形
Draw()和擦除
如两个或三个,设计并编写代码实现一个多例类。
6.使用单例模式设计一个多文档窗口(注:在
Java AWT/Swing开发中可使用
JDesktopPane和JInternalFrame来实现),要求在主窗体中某个内部子窗体只能实例化一次,
即只能弹出一个相同的子窗体,如下图所示,编程实现该功能。
(注:用C#或C++实现类似功能也可以)
(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制
Erase()两个方法,要求在绘制不支持的几何图形时,抛出一个
UnsupportedShapeException
异常,绘制类图并编程模拟实现。
3.现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计
图形,setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()
display()方法用于显示图形。
《设计模式》实验指导书
哈尔滨理工大学计算机学院实验教学中心《设计模式》实验实验指导书 (3)实验一Factory模式与Abstract Factory模式 (3)实验二Adapter模式 (14)实验三Observer模式 (18)实验四Interpreter模式 (25)实验指导书实验一Factory模式与Abstract Factory模式[实验目的]1.掌握Factory模式与Abstract Factory模式的意图及其代码实现。
2.了解两种模式的区别。
[实验内容]用C++语言实现Factory模式与Abstract Factory模式。
[实验要点及说明]1、Factory模式Factory模式的作用:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method使一个类的实例化延迟到其子类。
UML 结构图:抽象基类:1)Product:创建出来的对象的抽象基类。
2)Factory:创建对象的工厂方法的抽象基类。
接口函数:1)Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的Product。
解析:在这个模式中,有两个抽象基类,一个是Product为创建出来的对象的抽象基类,一个是Factory是工厂的抽象基类,在互相协作的时候都是由相应的Factory派生类来生成Product的派生类,也就是说如果要新增一种Product那么也要对应的新增一个Factory,创建的过程委托给了这个Factory,也就是说一个Factory和一个Product是一一对应的关系。
备注:设计模式的演示图上把Factory类命名为Creator,下面的实现沿用了这个命名。
演示实现:1)Factory.h#ifndef FACTORY_H#define FACTORY_Hclass Product{public:Product(){}virtual ~Product(){}};class ConcreateProduct: public Product{public:ConcreateProduct();virtual ~ConcreateProduct();};class Creator{public:Creator(){}virtual ~Creator(){}void AnOperation();protected:virtual Product* FactoryMethod() = 0;};class ConcreateCreator: public Creator{public:ConcreateCreator();virtual ~ConcreateCreator();protected:virtual Product* FactoryMethod();};#endif2)Factory.cpp#include "Factory.h"#include <iostream>using namespace std;ConcreateProduct::ConcreateProduct(){std::cout << "construction of ConcreateProduct\n"; }ConcreateProduct::~ConcreateProduct(){std::cout << "destruction of ConcreateProduct\n"; }void Creator::AnOperation(){Product* p = FactoryMethod();std::cout << "an operation of product\n";}ConcreateCreator::ConcreateCreator(){std::cout << "construction of ConcreateCreator\n";}ConcreateCreator::~ConcreateCreator(){std::cout << "destruction of ConcreateCreator\n";}Product* ConcreateCreator::FactoryMethod(){return new ConcreateProduct();}3)Main.cpp(测试代码)#include "Factory.h"#include <stdlib.h>int main(int argc,char* argv[]){Creator *p = new ConcreateCreator();p->AnOperation();delete p;system("pause");return 0;}2、Abstract Factory模式作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
设计模式大作业实验报告
蛋糕订购系统一、实验介绍 (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;public class Client {public static void 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;public interface DiscountStyle {public double disCount(double price,double m);}b)折方式一DiscountStyleOne.java:package net.xsl.ordercake.discount;public class DiscountStyleOne implements DiscountStyle{public double disCount(double price,double m) {return price;}}c)打折方式二DiscountStyleTwo.java:package net.xsl.ordercake.discount;public class DiscountStyleTwo implements DiscountStyle{public double disCount(double price,double m) {price = price - m;return price;}}d)打着方式三DiscountStyleThree.java:package net.xsl.ordercake.discount;public class DiscountStyleThree implements DiscountStyle{ public double disCount(double price,double m) {price = price * m/10;return price;}}e)订蛋糕对象类,使用了get/set方法OrderCake.java:package net.xsl.ordercake.discount;public class OrderCake {double money,price;//money是打折后的最终价格,price是原价DiscountStyle style;double m;public double getMoney(double price,double m){return style.disCount(price,m);}public void setPrice(double price){this.price = price ;}public double getPrice(){return price;}public void setStyle(DiscountStyle style){this.style = style ;}public DiscountStyle getStyle(){return style;}public void setM(double m){this.m = m ;}public double getM(){return m;}}(三)顾客向蛋糕订购蛋糕(观察者模式),并在具体主题中使用了单例模式a)主题Shop.java:package net.xsl.ordercake.order;public interface Shop {public void addCustomer(Customer o);public void deleteCustomer(Customer o);public void notifyCustomer();}b)具体主题(使用了单例模式,只能创建一个蛋糕商店的对象)CakeShop.java:package net.xsl.ordercake.order;import java.util.ArrayList;public class CakeShop implements Shop{String name;boolean changed;ArrayList<Customer>personList;private int i = 0;private static CakeShop uniqueCakeShop;private CakeShop() {uniqueCakeShop = this;personList = new ArrayList<Customer>();name = "";changed = false;}public static synchronized CakeShop getCakeShop(){if(uniqueCakeShop == null){uniqueCakeShop = new CakeShop();}return uniqueCakeShop;}public void addCustomer(Customer o) {if(!(personList.contains(o)))personList.add(o);}public void deleteCustomer(Customer o) {if((personList.contains(o)))personList.remove(o);}public void notifyCustomer() {if(changed){try{Customer customer = personList.get(i);customer.orderCake(name);i++;changed = false;}catch(Exception e){System.out.println("没有新的订购信息");}}}public void getNewName(String str){if(str.equals(name))changed = false;else{name = str;changed = true;}}}c)观察者Customer.java:package net.xsl.ordercake.order;public interface Customer {public void 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 kFactory;public class EastVilla implements Customer{Shop shop;private String cakeType;public EastVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void 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();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake eastVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =eastVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake eastVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = eastVilla1.makeMilkCake();milkCake.createCake();}}}e)具体观察者二WestVilla.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 kFactory;public class WestVilla implements Customer{Shop shop;private String cakeType;public WestVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void 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 westVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = westVilla.makeFruityCake();fruitCake.createCake();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake westVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =westVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake westVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = westVilla1.makeMilkCake();milkCake.createCake();}}}(四)JDBC(门面模式)JDBCFacade.java:package net.xsl.ordercake.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class JDBCFacade {Connection conn = null;Statement stmt = null;ResultSet rs = null;String sqlStr = "";public void createStatement() {try {stmt = conn.createStatement();} catch (SQLException e) {e.printStackTrace();}}public ResultSet jdbcSelect(String sqlStr){this.sqlStr = sqlStr;getConnection();createStatement();try {rs = stmt.executeQuery(sqlStr);ResultSetMetaData rsmd = rs.getMetaData();int j = 0;j = rsmd.getColumnCount();while(rs.next()){for(int i=0;i<j;i++){System.out.print(rs.getString(i+1));System.out.print("\t");}System.out.println();}} catch (SQLException e) {e.printStackTrace();}return rs;}public void jdbcUpdate(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("表更新 " + count + " 条数据");} catch (SQLException e) {System.out.println("更新数据失败");}}public void jdbcInsert(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表插入 " + count + " 条数据");} catch (SQLException e) {System.out.println("插入数据失败" + e.getMessage());}}public void jdbcDelete(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表删除 " + count + " 条数据");} catch (SQLException e) {System.out.println("删除数据失败");}}public void jdbcClose(){try {rs.close();stmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}public Connection getConnection() {try {Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cakeshop","root","admin");} catch (Exception e) {System.out.println("数据库连接失败" + e.getMessage());}return conn;}}(五)构造蛋糕(工厂方法模式):a)构造者MakeCake.java:package net.xsl.ordercake.creator;public interface MakeCake {}b)具体构造者一MakeChocolateCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.ChocolateFactory;public class MakeChocolateCake implements MakeCake{ private String cakeType;public MakeChocolateCake(String cakeType){this.cakeType = cakeType;}public ChocolateFactory makeChocolateCake(){return new ChocolateFactory(cakeType);}}c)具体构造者二MakeFruityCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.FruitFactory;public class MakeFruityCake implements MakeCake{ private String cakeType;public MakeFruityCake(String cakeType){this.cakeType = cakeType;}public FruitFactory makeFruityCake(){return new FruitFactory(cakeType);}}d)具体构造者三MakeMilkCake.java:package net.xsl.ordercake.creator;import kFactory;public class MakeMilkCake implements MakeCake{ private String cakeType;public MakeMilkCake(String cakeType){this.cakeType = cakeType;}public MilkFactory makeMilkCake(){return new MilkFactory(cakeType);}}e)抽象产品Factory.java:package net.xsl.ordercake.product;public interface Factory {public void createCake();}f)具体产品一FruitFactory.java:package net.xsl.ordercake.product;public class FruitFactory implements Factory{ private String cakeType;public FruitFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("草莓水果")){FruityCake strawberryCake = new StrawberryCake();strawberryCake.show();}else if (cakeType.equals("葡萄水果")) {FruityCake grapeCake = new GrapeCake();grapeCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}g)具体产品二MilkFactory.java:package net.xsl.ordercake.product;public class MilkFactory implements Factory{private String cakeType;public MilkFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("双层鲜奶")){MilkCake doubleMilkCake = new DoubleMilkCake();doubleMilkCake.show();}else if (cakeType.equals("甜奶")) {MilkCake sweetMilkCake = new SweetMilkCake();sweetMilkCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}h)具体产品三ChocolateFactory.java:package net.xsl.ordercake.product;public class ChocolateFactory {private String cakeType;public ChocolateFactory(String cakeType){this.cakeType = cakeType ;}public void createCake(){try{if (cakeType.equals("牛奶巧克力")){ChocolateCake milkChocolateCake = new MilkChocolateCake();milkChocolateCake.show();}else if (cakeType.equals("黑巧克力")) {ChocolateCake darkChocolateCake = new DarkChocolateCake();darkChocolateCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}(六)蛋糕工厂(简单工厂模式):a)水果蛋糕:i.FruitFactory.java(第五项构造蛋糕中已贴出):ii.接口类FruityCake.java:package net.xsl.ordercake.product;public interface FruityCake {public void show();}iii.实现接口:StrawberryCake.java:package net.xsl.ordercake.product;public class StrawberryCake implements FruityCake{ public void show() {System.out.println("生产了一个草莓水果蛋糕");}}GrapeCake.java:package net.xsl.ordercake.product;public class GrapeCake implements FruityCake{public void show() {System.out.println("生产了一个葡萄水果蛋糕");}}b)牛奶蛋糕:kFactory.java(第五项构造蛋糕中已贴出):ii.接口类MilkCake.java:package net.xsl.ordercake.product;public interface MilkCake {void show();}iii.实现接口:SweetMilkCake.java:package net.xsl.ordercake.product;public class SweetMilkCake implements MilkCake{ public void show() {System.out.println("生产了一个甜奶蛋糕");}}DoubleMilkCake.java:package net.xsl.ordercake.product;public class DoubleMilkCake implements MilkCake{public void show() {System.out.println("生产了一个双层鲜奶蛋糕");}}c)巧克力蛋糕:i.ChocolateFactory.java(第五项构造蛋糕中已贴出):ii.接口类ChocolateCake.javapackage net.xsl.ordercake.product;public interface ChocolateCake {void show();}iii.实现接口:DarkChocolateCake.java:package net.xsl.ordercake.product;public class DarkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个黑巧克力蛋糕");}}MilkChocolateCake.java:package net.xsl.ordercake.product;public class MilkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个牛奶巧克力蛋糕");}}六、程序运行截图七、实验总结本次实验的实现过程中,对有些模式理解还不是很深刻,后来通过翻阅教科书,研究它的示例程序,还有老师的ppt,其中最重要的是它的类图,最终使用了出来,并把它和其他模式结合在一起。
设计模式实验报告
设计模式实验报告一、实验目的通过本次实验,旨在让学生了解并掌握常见的设计模式,在实际场景中使用设计模式来解决软件设计中的复杂问题。
二、实验内容1.理论研究:学生需要深入研究常见的设计模式,包括创建型、结构型和行为型设计模式,并了解每种设计模式的适用场景和解决方案。
2.实践应用:学生需要选择3种不同类型的设计模式进行实践应用,并编写代码来演示每种设计模式的应用。
三、实验过程1.理论研究在理论研究阶段,我选择了单例模式、适配器模式和策略模式进行深入研究。
1.1单例模式单例模式是一种常用的创建型设计模式。
它保证其中一个类只有一个实例,并提供一个全局访问点来访问这个实例。
单例模式适用于需要频繁创建和销毁对象的场合。
1.2适配器模式适配器模式是一种常用的结构型设计模式。
它将一个类的接口转换成客户希望的另一个接口。
适配器模式可以让不兼容的类能够合作,提供一个统一的接口。
1.3策略模式策略模式是一种常用的行为型设计模式。
它定义一系列算法,将它们封装起来,并且使它们可以相互替换,让算法的变化独立于使用算法的客户。
2.实践应用在实践应用阶段,我选择了Java编写代码来演示每种设计模式的应用。
2.1单例模式应用首先,我创建了一个Singleton类,保证该类只有一个实例。
在该类中声明一个私有静态变量instance,并将构造方法设置为私有,防止在外部创建新的实例。
然后,通过一个公有的静态方法来获取该类的实例。
2.2适配器模式应用接下来,我创建了一个MediaPlayer接口,包含了播放音频和视频的两个方法。
然后,我创建了一个AdvancedMusicPlayer类,实现了播放音频的方法。
接着,我创建了一个MediaPlayerAdapter类,实现了MediaPlayer接口,将AdvancedMusicPlayer适配成MediaPlayer的形式。
使用适配器模式可以让调用方可以统一调用MediaPlayer的接口,无需知道具体使用的是AdvancedMusicPlayer。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 结构型和行为型设计模式实验实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的熟练使用PowerDesigner和任意一种面向对象编程语言实现几种常见的结构型和行为型设计模式,包括代理模式、职责链模式和命令模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验内容1. 在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法method()调用之前输出“方法method()被调用,调用时间为2014-11-5 10:10:10”,调用之后如果没有抛异常则输出“方法method()调用成功”,否则输出“方法method()调用失败”。
在代理类中调用真实业务类的业务方法,使用代理模式设计该日志记录模块的结构,绘制类图并编程模拟实现。
2. 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:(1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统;(2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
试使用代理模式设计并编程模拟实现该收费商务信息查询系统。
【提示:使用保护代理和智能引用代理】3. 某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。
该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。
如下图所示:试使用职责链模式设计并实现该系统。
4. 某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询上下文中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定的顺序转发给其他查询环境。
基于上述需求,试采用职责链模式对该系统进行设计。
5. 房间中的开关就是命令模式的一个实例,现用命令模式来模拟开关的功能,可控制对象包括电灯和电风扇,绘制相应的类图并编程模拟实现。
6. 某软件公司欲开发一个基于Windows平台的公告板系统。
系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。
菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。
现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
三、实验要求1. 结合实例,正确无误地绘制代理模式、职责链模式和命令模式的模式结构图;2. 使用任意一种面向对象编程语言实现代理模式、职责链模式和命令模式实例,代码运行正确无误。
四、实验步骤1. 结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;2. 结合实例,使用PowerDesigner绘制代理模式实例结构图并用面向对象编程语言实现该模式实例;3. 结合实例,使用PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言实现该模式实例;4. 结合实例,使用PowerDesigner绘制职责链模式实例结构图并用面向对象编程语言实现该模式实例;5. 结合实例,使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例;6. 结合实例,使用PowerDesigner绘制命令模式实例结构图并用面向对象编程语言实现该模式实例。
五、实验结果1. 类图:实现代码:AbstractLog.javapublic interface AbstractLog {public void method();}LogProxy.javaimport java.text.SimpleDateFormat;import java.util.Date;public class LogProxy implements AbstractLog {private LogRecord logRecord = new LogRecord();private SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private String time = SDF.format(new Date());2.类图:实现代码:AbstractSearch .javapublic interface AbstractSearch {String search(String uid);}SearchProxy.javapublic class SearchProxy implements AbstractSearch { private RealSearch realSearch = new RealSearch();private Validator validator;public String search(String uid) {if (Validate(uid)) {String result = realSearch.search(uid);public class Client {public static void main(String[] args){AbstractSearch as;as = (AbstractSearch)XMLUtil.getBean();as.search("uid");}}3.类图:实现代码:Leader.javapublic abstract class Leader {protected Leader successor;protected String name;public Leader(){}public abstract void handleRequest(PurchaseRequest pRequest);public Leader(String name) { = name;}public void setSuccessor(Leader successor) {4.类图:实现代码:SearchContext.javapublic abstract class SearchContext {protected SearchContext successor;public void setSuccessor(SearchContext successor) {this.successor = successor;}public abstract void search(String key);}SearchContext1.javapublic class SearchContext1 extends SearchContext {public void search(String key) {if (key == "key1")System.out.println("在Context1中查到相关内容");else if (this.successor != null)this.successor.search(key);5.类图:实现代码:Switch.javapublic class Switch {private AbstractCommand abstractCommand;public void setComman(AbstractCommand abstractCommand) { this.abstractCommand = abstractCommand;}public void open() {abstractCommand.open();}public void close() {abstractCommand.close();}}AbstractCommand.javapublic abstract class AbstractCommand {public abstract void open();public abstract void close();}6.类图:实现代码:Menu.javaimport java.util.ArrayList;public class Menu {public ArrayList<MenuItem> menuItemList = new ArrayList<MenuItem>();public void addMenuItem(MenuItem menuItem) {menuItemList.add(menuItem);System.out.println(menuItem.getName() + "功能加入主菜单");}public void removeMenuItem(MenuItem menuItem) {menuItemList.remove(menuItem);System.out.println(menuItem.getName() + "功能从主菜单中移除");}}MenuItem.javapublic class MenuItem {。