《设计模式》实验指导书08版Word下载.docx
《《设计模式》实验指导书08版Word下载.docx》由会员分享,可在线阅读,更多相关《《设计模式》实验指导书08版Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
图5基于UML插件生成Java代码
实验一、单例模式(2学时)
【实验目的】
1、了解单例模式的应用场景、目的和解决问题的方法。
2、掌握单例模式的结构、各角色之间的协作过程和代码实现。
3、了解单例模式的应用。
【实验性质】
验证性实验
【实验内容与步骤】
1、试用Java或C#语言,以多种方式实现单例模式,调试运行你的程序,并对各种方式进行评价。
2、选择1题中某一种形式的例子加以改造,使其至多能够产生4个不同实例。
【实验作业】
1、单例模式的目的是什么?
试用UML图表示单例模式的结构,并指明单例模式所涉及的角色、各角色的功能以及角色之间的协作关系。
2、客户端如何使用单例模式(即客户程序如何调用单例模式模块创建对象)?
3、寻找一个简单的连接池组件,试分析单例模式在其中的应用(选作)。
实验二、抽象工厂模式(4学时)
1、了解抽象工厂模式的应用场景、目的和解决问题的方法。
2、掌握抽象工厂模式的结构、各角色之间的协作过程和代码实现。
3、了解抽象工厂模式的应用。
1、试用Java或C#语言实现抽象工厂模式的结构,并用代码说明客户端程序如何应用抽象工厂模式。
2、某地区的农产品市场分南方市场和北方市场,分别销售南方和北方的农产品。
其中农产品设计水果和素菜两大类,而水果有北方水果(如梨子)和南方水果(如香蕉)之分,蔬菜有北方素菜(如大蒜)和南方蔬菜(如黄瓜)之分。
现有客户购买梨子、香蕉各五十斤,大蒜和黄瓜各二十斤,请用代码模拟。
1、谈谈你对产品族、产品等级等概念的理解和认识。
2、试用UML图表示抽象工厂模式的结构,并指明模式所涉及的角色、角色的功能以及各角色之间的协作关系。
3、抽象工厂模式、工厂方法模式以及简单工厂模式之间有什么区别和联系?
各用在什么场景下?
4、谈谈你对创建型模式的认识。
实验三、适配器模式(4学时)
1、了解适配器模式的应用场景、目的和解决问题的方法。
2、掌握适配器模式的结构、各角色之间的协作过程和代码实现。
3、了解适配器模式的应用。
综合性实验
1、试用Java或C#语言实现适配器模式的结构,并用代码说明客户端程序如何应用适配器模式。
2、考虑Cat和Dog两类对象,都有叫、跑、睡觉\抓老鼠等功能。
现在客户要用Cat抓老鼠,但客户没有Cat,只好求Dog帮忙,请用适配器模式模拟本例。
3、JTable是Swing中用表格形式显示数据的组件,由于不同客户对数据的管理要求是不同,JTable使用了适配器模式。
其中核心类有TableModel和AbstractTableModel。
JTable用TableModel接口提供的方法访问表格数据。
为方便编程,AbstractTableModel实现了TableModel大部分接口,客户只需实现AbstractTableModel即可。
请用UML图分析Jtable的这种实现机制,并举例说明Jtable的使用方法。
4、窗口(Windows)程序需要处理各种各样的事件,JavaSwing的事件处理机制涉及三个角色:
事件源(在该组件上产生了某种动作或事件)、事件(是什么样的事件,鼠标移动事件?
键盘点击事件?
对应java.util.EventObject)和事件监听者(该类实现对动作或事件的响应,对应java.util.EventListener)。
要使事件源A对事件B做C类型的处理,需要自定义事件监听类、给事件源(组件)注册监听:
A.AddCListener(Beventevent)
如果事件很多,则需要编写的监听类也很多。
请查阅资料,以例分析Java应用事件适配器来处理这个问题的机制,并上机实验。
1、适配器模式的目的是什么?
类适配器与对象适配器模式的区别是什么?
2、试用UML图表示适配器模式的结构,并指明适配器模式中的角色、各角色的功能及其协作关系。
实验四、代理模式(2学时)
1、了解代理模式的应用场景、目的和解决问题的方法。
2、掌握代理模式的结构、各角色之间的协作过程和代码实现。
3、了解远程代理模式的应用。
1、用Java或C#语言实现代理模式的结构,并用代码说明客户端程序如何应用代理模式。
2、验证JavaRMI中远程代理模式的使用
注:
Java中的RMI(远程方法调用)允许客户对象访问远程对象,涉及如下概念:
(1)远程接口:
声明远程对象向客户提供的方法,该接口必须实现java.rmi.Remote,且所有的方法必须被声明为抛出java.rmi.RemoteException异常;
一个远程对象应该实现该接口。
(2)远程对象:
具体实现远程接口中声明的方法,该对象要扩展java.rmi.UnicastRemoteObject;
必须有一个没有参数的构造函数;
必须部署在服务器上,服务器通过调用它的无参构造函数来创建远程对象的实例。
(3)客户:
试图调用远程方法的应用对象,其必须知道远程对象的远程接口;
通过对RMI注册表的搜索来查找远程对象。
(4)辅助机制RMI注册表:
其提供对不同远程对象的存储管理。
一个远程对象在注册表中用唯一一个名字来标示。
(5)存根编译器RMIC:
为远程对象生成存根和骨架。
本地存放远程对象的存根类和远程对象接口,其中的存根类负责把对远程对象的方法调用发送到远程对象所在的服务器上。
服务器上远程对象的骨架把接收到的远程调用转发给远程对象的实例,如图所示。
服务器端处理
RMI编程过程如下:
(1)准备服务器端程序
//远程接口
importjava.rmi.Remote;
importjava.rmi.RemoteException;
publicinterfaceRocketextendsRemote{
voidboost(doublefactor)throwsRemoteException;
doublegetApogee()throwsRemoteException;
doublegetPrice()throwsRemoteException;
}
//远程对象
importjava.rmi.*;
importjava.rmi.server.UnicastRemoteObject;
importcom.oozinoz.*;
publicclassRocketImplextendsUnicastRemoteObject
implementsRocket{
protecteddoubleprice;
protecteddoubleapogee;
publicRocketImpl(doubleprice,doubleapogee)
throwsRemoteException{
this.price=price;
this.apogee=apogee;
}
publicvoidboost(doublefactor){
apogee=factor;
publicdoublegetApogee(){
returnapogee;
publicdoublegetPrice(){
returnprice;
publicstaticvoidmain(String[]args){
try{
Rocketbiggie=newRocketImpl(29.5,820);
Naming.rebind("
rmi:
//localhost:
5000/Biggie"
biggie);
System.out.println("
远程对象biggie已经注册!
"
);
}catch(Exceptionee){
ee.printStackTrace();
}
(2)编译上述程序,在服务器端当前目录下用RMIC工具生成远程对象的存根和骨架(JDK1.6中骨架和存根合在一起)类
rmicRocketImpl
(3)启动服务器端RMI监听端口
Startrmiregistry5000
(4)注册远程对象
JavaRocketImpl
(5)客户端编程
publicclassShowRocketClient{
publicstaticvoidmain(String[]args){
//TODO:
Addyourcodehere
try{
Objectobj=Naming.lookup("
Rocketbiggie=(Rocket)obj;
Apogeeis"
+biggie.getApogee());
}catch(Exceptione){
Exceptionwhilelookuparocket"
e.printStackTrace();
}
(6)把服务器端Rocket和存根类复制到客户端的当前目录下,编译上程序。
(7)运行客户端程序
JavaShowRocketClient
如果运行程序时涉及权限问题,则服务器端用可采用如下形式:
Java–Djava.security.policy=java.policy远程对象类名注册表所在的远程主机的DNS或IP监听端口
(java.policy如下:
grant
{
permission.SocketPermission"
*:
1024-65535"
"
connect,accept,resolve"
;
1-1023"
connect,resolve"
permissionjava.io.FilePermission"
c:
\\dp\\Proxy\\server\\*"
"
read,write"
};
)
客户端调用可采用如下形式:
Java–Djava.security.policy=java.policy客户端类名注册表所在的远程主机的DNS或IP监听端口
1、代理模式的目的是什么?
使用在什么场景下?
试用UML图表示代理模式的结构,并指明代理模式中的角色、各角色的功能及其协作关系。
2、结构型模式有什么特点?
3、Java使用流的机制来实现输入/输出。
流是数据的有序排列,从流源出发,到流到某个目的地。
流分输入流和输出流。
应用程序从输入流读取数据,向输出流写数据。
如应用程序使用FileInputStream从磁盘读取数据,用FileOutputStream向磁盘写数据。
可以使用数组、String、File作为流源,也可以用一个已经存在的流作流源。
Java的流具有对称性:
输入-输出对称:
InputStream与OutputStram负责Byte流的输入与输出;
Reader与Writer负责Char流的输入与输出。
Byte-Char对称:
InputStream和Reader的子类分别负责Byte和Char流的输入;
OutputStram和Writer分别负责Byte和Char流的输出。
Java使用装饰模式对一些流处理器做装饰,以改进性能或功能。
如通过装饰Inputstream,得到具有特定功能的新流,如DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream(注:
这些类的基类都是FilterInputStram)。
通过装饰OutputStream,得到新流DataOutputStream、PrintStream、BufferedOutputStream。
此外,Java在实现一些流处理器时,使用了装饰模式。
如FileInputStream继承InputStream,引用FileDiscriptor对象,把FileDiscriptor对象适配成InputStream对象。
依据上述背景介绍,查阅资料,从适配器模式和装饰模式分析JavaIO类的设计机制(最好找到JDK的源码,通过分析源码,画UML图来分析)。
实验五、观测者模式(4学时)
1、了解观测者模式的应用场景、目的和解决问题的方法。
2、掌握观测者模式的结构、各角色之间的协作过程和代码实现。
3、了解观测者模式的应用。
1、用Java或C#语言实现观测者模式的结构,并用代码说明客户端程序如何应用观测者模式。
2、请用观测者模式实现一个汽车驾驶室仪表系统,当汽车改变速度、改变方向时实时显示汽车的速度、方向、指示灯等信息。
3、从观测者模式的角度剖析并应用java.awt.image.ImageObserver。
1、试用UML图表示观测者模式的结构,并指明观测者模式的角色、各角色的功能及其协作关系,并谈谈你对观测者模式的理解。
2、查阅资料,以例说明Java或C#对观测者模式的支持(如java.util.Observable)
3、行为型模式有何特点?