实验3.docx
《实验3.docx》由会员分享,可在线阅读,更多相关《实验3.docx(12页珍藏版)》请在冰豆网上搜索。
![实验3.docx](https://file1.bdocx.com/fileroot1/2022-11/23/2f5657c1-3a52-457b-8574-584d207c9ef6/2f5657c1-3a52-457b-8574-584d207c9ef61.gif)
实验3
深圳大学实验报告
课程名称:
软件体系结构
实验项目名称:
行为模式分析与应用
学院:
计算机与软件学院
专业:
软件工程
指导教师:
毛斐巧
报告人:
学号:
班级:
实验时间:
2016/6/15
实验报告提交时间:
2016/7/1
一、实验目的与要求:
(1)熟悉并会用辅助工具绘制职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式这7种行为型模式的类结构图;
(2)会灵活应用这7种行为型设计模式。
(3)1人一组单独完成实验并提交实验报告。
二、实验内容
1.行为型设计模式分析
使用PowerDesigner或MicrosoftVisio等辅助工具绘制职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式这7种行为型模式的类结构图,并进行分析,指出包含的各角色类。
另外,这7种行为型设计模式的使用频率如何?
哪种使用频率最高?
哪种最低?
2.自由选择应用(可以针对不同模式选取不同的小应用,允许使用课堂中讲到的例子应用),使用任意一种面向对象编程语言分别实现职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式的应用,代码运行正确无误,给出运行结果。
三、实验结果
1.7种行为型设计模式分析:
职责链模式
类结构图
分析
● Handler(抽象处理者):
它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。
因为每一个处理者的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象(如结构图中的successor),作为其对下家的引用。
通过该引用,处理者可以连成一条链。
● ConcreteHandler(具体处理者):
它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。
命令模式
类结构图
分析
● Command(抽象命令类):
抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
● ConcreteCommand(具体命令类):
具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。
在实现execute()方法时,将调用接收者对象的相关操作(Action)。
● Invoker(调用者):
调用者即请求发送者,它通过命令对象来执行请求。
一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。
在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
● Receiver(接收者):
接收者执行与请求相关的操作,它具体实现对请求的业务处理。
迭代器模式
类结构图
分析
● Iterator(抽象迭代器):
它定义了访问和遍历元素的接口,声明了用于遍历数据元素的方法,例如:
用于获取第一个元素的first()方法,用于访问下一个元素的next()方法,用于判断是否还有下一个元素的hasNext()方法,用于获取当前元素的currentItem()方法等,在具体迭代器中将实现这些方法。
● ConcreteIterator(具体迭代器):
它实现了抽象迭代器接口,完成对聚合对象的遍历,同时在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。
● Aggregate(抽象聚合类):
它用于存储和管理元素对象,声明一个createIterator()方法用于创建一个迭代器对象,充当抽象迭代器工厂角色。
● ConcreteAggregate(具体聚合类):
它实现了在抽象聚合类中声明的createIterator()方法,该方法返回一个与该具体聚合类对应的具体迭代器ConcreteIterator实例。
观察者模式
类结构图
分析
● Subject(目标):
目标又称为主题,它是指被观察的对象。
在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。
目标类可以是接口,也可以是抽象类或具体类。
● ConcreteSubject(具体目标):
具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有的话)。
如果无须扩展目标类,则具体目标类可以省略。
● Observer(观察者):
观察者将对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
● ConcreteObserver(具体观察者):
在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。
通常在实现时,可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。
状态模式
类结构图
分析
● Context(环境类):
环境类又称为上下文类,它是拥有多种状态的对象。
由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。
在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
● State(抽象状态类):
它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
● ConcreteState(具体状态类):
它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
策略模式
类结构图
分析
● Context(环境类):
环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。
在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
● Strategy(抽象策略类):
它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。
环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。
● ConcreteStrategy(具体策略类):
它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
模板方法模式
类结构图
分析
● AbstractClass(抽象类):
在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。
同时,在抽象类中实现了一个模板方法(TemplateMethod),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
● ConcreteClass(具体子类):
它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
使用频率如下,
模式
使用频率
职责链模式
★★☆☆☆
命令模式
★★★★☆
迭代器模式
★★★★★
观察者模式
★★★★★
状态模式
★★★☆☆
策略模式
★★★★☆
模板方法模式
★★★☆☆
由表可知,使用频率最高的是迭代器模式、观察者模式,最低是职责链模式。
2.7种行为型设计模式应用:
职责链模式
应用:
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果大于等于3天,小于10天,经理可以审批;如果大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应拒绝信息。
运行结果:
命令模式
应用:
电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机不同的操作。
抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:
打开电视机、关闭电视机和切换频道。
运行结果:
迭代器模式
应用:
电视机遥控器也是一个迭代器的实例,可以对电视机频道集合进行遍历操作。
运行结果:
观察者模式
应用:
假设猫是老鼠和狗的观察者,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程。
运行结果:
状态模式
应用:
Sunny软件公司欲为某银行开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,Sunny软件公司开发人员发现在该系统中,账户存在三种状态,且在不同状态下账户存在不同的行为,具体说明如下:
(1)如果账户中余额大于等于0,则账户的状态为正常状态(NormalState),此时用户既可以向该账户存款也可以从该账户取款;
(2)如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(OverdraftState),此时用户既可以向该账户存款也可以从该账户取款,但需要按天计算利息;
(3)如果账户中余额等于-2000,那么账户的状态为受限状态(RestrictedState),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息;
(4)根据余额的不同,以上三种状态可发生相互转换。
运行结果:
策略模式
应用:
某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1) 学生凭学生证可享受票价8折优惠;
(2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);
(3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
运行结果:
模板方法模式
应用:
某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下:
(1) 系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示;
(2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式);
(3) 系统显示利息。
试使用模板方法模式设计该利息计算模块。
运行结果:
四、实验总结与体会
本次实验学习了职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式这7种行为型模式,从概念出发,通过画类结构图,再到代码实战,全面地对这7种模式进行学习,可谓受益匪浅。
这对我以后编写代码无论是从风格还是代码优化都有很大的帮助。
此次实验是最后一次实验,在此表示对老师这一学期辛勤付出的感谢。
五、成绩评定及评语
1.评语
2.成绩评定