《Java设计模式》实验教学大纲
课程名称:
| Java设计模式
|
|
|
课程编号:
| 436305
|
|
|
适用专业:
| 软件工程
|
|
|
总 学 分:
| 3
|
|
|
总 学 时:
| 54
|
|
|
其中实验学时
| 26
|
|
|
一、实验课程性质、目的与任务
本实验课程的任务包括熟悉软件建模工具PowerDesinger、使用PowerDesigner构造系统的静态模型,熟悉常用的设计模式的定义和结构,使用PowerDesigner和Java语言实现常见设计模式,学会分析设计模式的优缺点和适用范围。
本实验课程是在进行《设计模式》课程学习时同步进行的上机实验,而不是一门单独的实验课程。在学习本课程之前,学生需完成软件工程、C++或Java面向对象程序设计课程的学习。
Java设计模式重点探讨在Java程序设计中怎样使用著名的23个设计模式,让学生不仅学习怎样在软件设计中使用好设计模式,更重要的是让学生通过学习使用设计模式深刻地理解面向对象的设计思想,以便更好地使用面向对象语言解决设计中的诸多问题。
本课程的主要目的是让学生熟悉PowerDesigner的使用,掌握常用的设计模式的定义与结构,理解其设计方案和实现原理,结合实例场景运用设计模式解决项目实际问题,提高系统设计水平和代码质量,让学生进一步理解面向对象思想的精髓,为成为一名优秀的面向对象软件开发人员奠定坚实的基础。同时学生将学会分析设计模式的优缺点,熟悉模式的适用场景。该课程是一门实践性很强的课程,要求学生具备有一定的分析设计能力和编码能力。
二、实验教学基本要求
通过本实验课程,学生将熟悉主流软件建模工具PowerDesigner的安装和使用,使用PowerDesigner绘制类图;对实例场景进行分析,选择合适的设计模式,绘制类图并使用Java编码实现,理解模式结构及实现过程,分析模式优缺点,熟悉其适用环境。
上机实验要求:
1、准备好上机所需的程序;
2、上机输入和调试自己所编写的程序;
3、上机结束后,应整理出实验报告,实验报告应包括以下内容:实验项目名称;算法分析;程序清单;运行结果;对运行情况所作的分析以及本次调试程序所取得的经验,如果程序未能通过,应分析其原因。
三、实验项目与类型:
序号
| 实验项目
| 学时
| 实验性质
| 备注
|
验证
| 综合
| 设计
| 研究
探索
| 必做
| 选做
|
1
| 工厂方法模式
| 6
| √
|
|
|
| √
|
|
2
| 抽象工厂模式
| 2
|
|
| √
|
| √
|
|
3
| 单例模式
| 2
|
|
| √
|
| √
|
|
4
| 适配器模式
| 2
|
| √
|
|
| √
|
|
5
| 组合模式
| 4
|
|
| √
|
| √
|
|
6
| 装饰模式
| 2
|
|
| √
|
| √
|
|
7
| 代理模式
| 2
|
| √
|
|
| √
|
|
8
| 观察者模式
| 3
|
|
| √
|
| √
|
|
9
| 策略模式
| 3
|
|
| √
|
| √
|
|
10
| 迭代模式
|
|
|
| √
|
|
| √
|
11
| 命令模式
|
|
|
| √
|
|
| √
|
12
| 访问者模式
|
|
|
| √
|
|
| √
|
13
| 解释器模式
|
|
|
| √
|
|
| √
|
四、实验教学内容
实验一:工厂方法模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现工厂方法模式,运行并测试模式实例代码。
2、方法原理
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个的时候。
参与者
1. Product
定义工厂方法所创建的对象的接口。
2. ConcreteProduct
实现Product接口。
3. Creator
声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。可以调用工厂方法以创建一个Product对象。
4. ConcreteCreator
重定义工厂方法以返回一个ConcreteProduct实例。
类图
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成工厂方法模式、抽象工厂模式和单例模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验二:抽象工厂模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现抽象工厂模式,运行并测试模式实例代码。
2、方法原理
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示它们接口而不是实现时。
参与者
1. AbstractFactory
声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory
实现创建具体产品对象的操作。
3.AbstractProduct
为一类产品对象声明一个接口。
4.ConcreteProduct
定义一个将被相应的具体工厂创建的产品对象。
实现abstractProduct接口。
5.Client
仅使用由AbstractFactory和AbstractProduct类声明的接口
类图
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成抽象工厂模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验三:单例模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现单例模式,运行并测试模式实例代码。
2、方法原理
保证一个类仅有一个实例,提供一个访问它的全局访问点。
适用性
1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
参与者
Singleton
定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作。
可能负责创建它自己的唯一实例。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成单例模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验四:适配器模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现适配器模式,运行并测试模式实例代码。
2、方法原理
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性
1.你想使用一个已经存在的类,而它的接口不符合你的需求。
2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那接口可能不一定兼容的类)协同工作。
3.(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
参与者
1. Target
定义Client使用的与特定领域相关的接口。
2. Client
与符合Target接口的对象协同。
3. Adaptee
定义一个已经存在的接口,这个接口需要适配。
4. Adapter
对Adaptee的接口与Target接口进行适配
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成适配器模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验五:组合模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现组合模式,运行并测试模式实例代码。
2、方法原理
将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对*的使用具有一致性。"
适用性
1.你想表示对象的部分-整体层次结构。
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
参与者
1. Component
为组合中的对象声明接口。
在适当的情况下,实现所有类共有接口的缺省行为。
声明一个接口用于访问和管理Component的子组件。
(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合并的情况下实现它。
2. Leaf
在组合中表示叶节点对象,叶节点没有子节点。
在组合中定义节点对象的行为。
3. Composite
定义有子部件的一些部件的行为。
存储子部件。
在Component接口中实现与子部件所有的操作。
4. Client
通过Component接口操纵组合部件的对象。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成组合模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验六:装饰模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现装饰模式,运行并测试模式实例代码。
2、方法原理
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
适用性
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤消的职责。
3.当不能采用生成子类的方法进行扩充时。
参与者
1.Component
定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent
定义一个对象,可以给这个对象添加一些职责。
3.Decorator
维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
4.ConcreteDecorator
向组件添加职责。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成装饰模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验七:代理模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现代理模式,运行并测试模式实例代码。
2、方法原理
为其他对象提供一种代理以控制对这个对象的访问。
适用性
1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代表。
2.虚代理(VirtualProxy)根据需要创建开销很大的对象。
3.保护代理(ProtectionProxy)控制对原始对象的访问。
4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。
参与者
1. Proxy
保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。
提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
控制对实体的*取,并可能负责创建和删除它。
其他功能依赖于代理的类型:
2. RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
3. VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问。
4. ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限。
5. Subject
定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
6. RealSubject
定义Proxy所代表的实体。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成代理模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验八:观察者模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现观察者模式,运行并测试模式实例代码。
2、方法原理
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用性
1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。
将这二者封装到独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
参与者
1.Subject(目标)
目标知道它的观察者。可以有任意多个观察者观察同一个目标。
提供注册和删除观察者对象的接口。
2.Observer(观察者)
为那些在目标发生改变时需获得通知的对象定义一个更新接口。
3.ConcreteSubject(具体目标)
将有关状态存入各ConcreteObserver对象。
当它的状态发生改变时,向它的各个观察者发出通知。
4.ConcreteObserver(具体观察者)
维护一个指向ConcreteSubject对象的引用。
存储有关状态,这些状态应与目标的状态保持一致。
实现Observer的更新接口,使自身状态与目标的状态保持一致
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成观察者模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验九:策略模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现策略模式,运行并测试模式实例代码。
2、方法原理
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性
1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2.需要使用一个算法的不同变体。
3.算法使用客户不应该的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4.一个类定义了多种行为,并且这些行为在这个类的操作中以*个条件语句的形式出现。
将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
参与者
1.Strategy
定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
2.ConcreteStrategy
以Strategy接口实现某具体算法。
3.Context
用一个ConcreteStrategy对象来配置。
维护一个对Strategy对象的引用。
可定义一个接口来让Stategy访问它的数据。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成策略模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验十:迭代模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现迭代模式,运行并测试模式实例代码。
2、方法原理
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用性
1.访问一个聚合对象的内容而无需暴露它的内部表示。
2.支持对聚合对象的多种遍历。
3.为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。
参与者
1.Iterator
迭代器定义访问和遍历元素的接口。
2.ConcreteIterator
具迭代器实现迭代器接口。
对该聚合遍历时跟踪当前位置。
3.Aggregate
聚合定义创建相应迭代器对象的接口。
4.ConcreteAggregate
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成迭代模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验十一:命令模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现命令模式,运行并测试模式实例代码。
2、方法原理
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
适用性
1.抽象出待执行的动作以参数化某对象。
2.在不同的时刻指定、排列和执行请求。
3.支持取消操作。
4.支持修改日志,这样当系统崩溃时,这修改可以被重做一遍。
5.用构建在原语操作上的高层操作构造一个系统。
参与者
1.Command
声明执行操作的接口。
2.ConcreteCommand
将一个接收者对象绑定于一个动作。
调用接收者相应的操作,以实现Execute。
3.Client
创建一个具体命令对象并设定它的接收者。
4.Invoker
要求该命令执行这个请求。
5.Receiver
知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成命令模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验十二:访问者模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现访问者模式,运行并测试模式实例代码。
2、方法原理
表示一个作用于某对象结构中的各元素的操作。
它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
适用性
1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,*你想避免让这些操作“污染”这些对象的类。
Visitor使得你可以将相关的操作集中起来定义在一个类中。
当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
3.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
改变对象结构类需要重定义对所有访问者的接口,这可能要很大的代价。
如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
参与者
1.Visitor
为该对象结构中ConcreteElement的每一个类声明一个Visit操作。
该操作的名字和特征标识了发送visit请求给该访问者的那个类。
这使得访问者可以确定正被访问元素具体的类。
这样访问者就可以通过该元素的特定接口直接访问它。
2.ConcreteVisitor
实现每个由Visitor声明的操作。
每个操作实现本算法的一部分,而该算法片断乃是对应于结构中对象的类。
ConcreteVisitor该算法提供了上下文并存储它的局部状态。
这一状态常常在遍历该结构的过程中累积结果。
3.Element
定义一个Accept操作,它以一个访问者为参数。
4.ConcreteElement
实现Accept操作,该操作以一个访问者为参数。
5.ObjectStructure
能枚举它的元素。
可以提供一个高层的接口以允许该访问者访问它的元素。
可以是一个复合或是一个集合,如一个列表或一个无序集合。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成访问者模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
实验十三:解释器模式
1、实验目的
学会使用PowerDesigner绘制场景所对应的类图;掌握使用Java语言实现解释器模式,运行并测试模式实例代码。
2、方法原理
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用性
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
1.该文法简单对于复杂的文法,文法的层次变得庞大而无法管理。
2.效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。
参与者
1.AbstractExpression(抽象表达式)
声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
2.TerminalExpression(终结符表达式)
实现与文法中的终结符相关联的解释操作。
一个句子中的每个终结符需要该类的一个实例。
3.N*nterminalExpression(非终结符表达式)
为文法中的非终结符实现解释(Interpret)操作。
4.Context(上下文)
包含解释器之外的一些全局信息。
5.Client(客户)
构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。
该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。
调用解释操作。
3、主要实验仪器及材料
计算机、PowerDesigner、Eclipse+JDK+JRE
4、实验内容
利用PowerDesigner绘制类图,在Eclipse+JDK+JRE平台上完成解释器模式的编程。使用JDK编译器调试、运行、验证该设计模式的程序。
五、考核方法
1.教师对学生实验过程完成情况进行详细登记,记入实验成绩中。
2.学生完成实验后按要求撰写实验报告,根据实验报告确定每次实验的等级。
3.实验成绩按20%比例计入课程期评总成绩中。
六、实验指导书及主要参考书目
1、实验指导书
自编实验指导书。
2、主要参考书:
[1]Steven等著,龚波等译《Java设计模式》,人民邮电出版社,2007
[2]Erich等著,李英军等译《设计模式——可复用面向对象软件的基础》(双语版),机械工业出版社,2009
[3]Doug Lea著,赵涌等译《Java并发编程——设计原则与模式》(第二版),中国电力出版社,2004
[4]阎宏编著,《Java与模式》,电子工业出版社,2004
主 撰 人:罗如为
审 核 人:罗如为
2012.6