java实验策略模式观察者模式和组合模式.docx
《java实验策略模式观察者模式和组合模式.docx》由会员分享,可在线阅读,更多相关《java实验策略模式观察者模式和组合模式.docx(50页珍藏版)》请在冰豆网上搜索。
java实验策略模式观察者模式和组合模式
资料范本
本资料为word版本,可以直接编辑和打印,感谢您的下载
java实验策略模式观察者模式和组合模式
地点:
__________________
时间:
__________________
说明:
本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容
实验二策略模式、观察者模式和组合模式
一、实验目的:
(1)学习和掌握策略模式;
(2)学习和掌握观察者模式;
(3)学习和掌握组合模式;
(4)学习和掌握使用这些模式解决实际问题;
二、实验内容
1.请使用策略模式实现下列编程要求:
已知几何形状家族有圆形、矩形、椭圆形、三角形等形状。
请用Java语言定义一个抽象类MyShape表示形状这样概念,
MyShape抽象类中提供了计算面积、周长、显示形状信息的抽象方法,然后分别
定义它的子类MyCircle(圆形)、MyRectangle(矩形)、MyEllipse(椭圆形)、
MyTriangle(三角形)等特定几何形状。
并绘制这些定义的几何家族的所有形状。
2.请用观察者模式实现功能:
学校发布信息,学生可以订阅,老师可以订阅,行政人员也可以订阅。
提示:
定义主题接口,观察者接口,定义Notice、学生、老师和行政人员类,定义测试类。
其中Notice类实现主题接口,老师、学生和行政人员实现观察者接口。
思考,如果要求实现学生和老师均可以订阅多个信息,即除了订阅学校发布信息,也可以订阅所属系发送的信息,请编程实现。
3.定义一个游戏地图。
地图是由每个方块拼合起来。
地图上有墙等障碍物,也有可以通行的基本图元构成。
请使用组合模式,绘制一个游戏地图,地图的内容自行定义,也可以类似图3形式:
图3游戏地图
4.已知有一个二维数组数据如图1所示,请结合策略模式、观察者模式和组合模式实现一个MVC结构的应用程序。
要求:
如果用户移动滑块,可以修改二维数组的值,并在运行的用户界面中显示出来。
其中,饼状图和柱状图中的区域分布为二位数组每一维的总和。
运行结果如图4和图5所示。
60
50
90
90
40
30
10
20
70
图4数据模型
图5运行结果
三、实验环境
1、PC微机;
2、DOS操作系统或Windows操作系统;
3、jdk程序集成环境Eclipse
四、源代码、测试结果及UML图
一:
1.UML图
2.源程序代码:
packagecourse.strategy.shape;
importjava.awt.Graphics;
importjava.util.ArrayList;
importjava.util.List;
importjavax.swing.JPanel;
//绘制所有图形
@SuppressWarnings("serial")
publicclassDrawShapeextendsJPanel{
privateListshapes;
publicDrawShape(){
shapes=newArrayList();
}
publicvoidaddShape(MyShapeshape){//添加图形
if(shape!
=null)shapes.add(shape);
}
publicvoidpaintComponent(Graphicsg){//依次绘制图形
for(MyShapems:
shapes){
ms.draw(g);
System.out.println(ms);
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjava.awt.Graphics;
//形状家族
publicabstractclassMyShape{
publicabstractfloatarea();
publicabstractfloatperimeter();
publicabstractvoiddraw(Graphicsg);
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjava.awt.Color;
importjava.awt.Graphics;
//圆形
publicclassMyCircleextendsMyShape{
privatestaticfinalfloatPI=3.14f;
privateintradius;//定义圆形半径
privateintx,y;//定义起点(x,y)坐标
publicMyCircle(intx,inty,intradius){//构造函数
super();
this.x=x;
this.y=y;
this.radius=radius;
}
@Override
publicfloatarea(){//求面积
//TODO自动生成的方法存根
returnPI*radius*radius;
}
@Override
publicfloatperimeter(){//求周长
//TODO自动生成的方法存根
return2*PI*radius;
}
@Override
publicStringtoString(){
return"MyCircle[radius="+radius+",x坐标="+x+",y坐标="+y+"]"+
"面积="+area()+",周长="+perimeter();
}
@Override
publicvoiddraw(Graphicsg){//绘制图形
//TODO自动生成的方法存根
g.setColor(Color.blue);
g.fillOval(x,y,2*radius,2*radius);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjava.awt.Color;
importjava.awt.Graphics;
//矩形
publicclassMyRectangleextendsMyShape{
privateintx,y;//定义起点(x,y)坐标
privateintwidth,height;//定义矩形的宽和高
publicMyRectangle(intx,inty,intwidth,intheight){
super();
this.x=x;
this.y=y;
this.width=width;
this.height=height;
}
@Override
publicfloatarea(){
//TODO自动生成的方法存根
returnwidth*height;
}
@Override
publicfloatperimeter(){
//TODO自动生成的方法存根
return2*(width+height);
}
@Override
publicStringtoString(){
return"MyRectangle[x坐标="+x+",y坐标="+y+",矩形宽="+width
+",矩形高="+height+"]"+"面积="+area()+",周长="+perimeter();
}
@Override
publicvoiddraw(Graphicsg){
//TODO自动生成的方法存根
g.setColor(Color.green);
g.fillRect(x,y,width,height);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjava.awt.Color;
importjava.awt.Graphics;
//椭圆形
publicclassMyEllipseextendsMyShape{
privatestaticfinalfloatPI=3.14f;
privateintx,y;//定义起点(x,y)坐标
privateintaLong,bShort;//定义椭圆的长轴和短轴
publicMyEllipse(intx,inty,intaLong,intbShort){
super();
this.x=x;
this.y=y;
this.aLong=aLong;
this.bShort=bShort;
}
@Override
publicfloatarea(){
//TODO自动生成的方法存根
return1.0f/4*PI*aLong*bShort;
}
@Override
publicfloatperimeter(){
//TODO自动生成的方法存根
returnPI*bShort+2*(aLong-bShort);
}
@Override
publicStringtoString(){
return"MyEllipse[x坐标="+x+",y坐标="+y+",长轴="+aLong
+",短轴="+bShort+"]"+"面积="+area()+",周长="+perimeter();
}
@Override
publicvoiddraw(Graphicsg){
//TODO自动生成的方法存根
g.setColor(Color.red);
g.fillOval(x,y,aLong,bShort);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjava.awt.Color;
importjava.awt.Graphics;
//三角形
publicclassMyTriangleextendsMyShape{
privateinta,b,c,n;
privateint[]xPoints;
privateint[]yPoints;
publicMyTriangle(int[]xPoints,int[]yPoints,intn,inta,intb,intc){
super();
this.xPoints=xPoints;
this.yPoints=yPoints;
this.n=n;
this.a=a;this.b=b;this.c=c;
}
@Override
publicfloatarea(){
//TODO自动生成的方法存根
floatp=(a+b+c)/2;
return(float)Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
@Override
publicfloatperimeter(){
//TODO自动生成的方法存根
returna+b+c;
}
@Override
publicStringtoString(){
return"MyTriangle[a="+a+",b="+b+",c="+c+"]"+
"面积="+area()+",周长="+perimeter();
}
@Override
publicvoiddraw(Graphicsg){
//TODO自动生成的方法存根
g.setColor(Color.yellow);
g.fillPolygon(xPoints,yPoints,n);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.strategy.shape;
importjavax.swing.JFrame;
//测试程序
publicclassTest{//测试绘制所有形状
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
JFrameframe=newJFrame();
DrawShapeds=newDrawShape();
ds.addShape(newMyCircle(20,20,60));
ds.addShape(newMyRectangle(200,20,120,100));
ds.addShape(newMyEllipse(40,200,150,100));
intxPoints[]={300,240,370};
intyPoints[]={200,280,300};
ds.addShape(newMyTriangle(xPoints,yPoints,3,9,12,15));
frame.getContentPane().add(ds);
frame.setTitle("绘制图形演示");
frame.setSize(500,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
3.测试结果图:
二:
1.UML图:
2.源代码:
packagecourse.observer.notice;
//主题
publicinterfaceSubject{
publicvoidregisterObserver(Observerobserver);
publicvoidremoveObserver(Observerobserver);
publicvoidnotifyAllObservers();
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;
//学校通知
publicclassNoticeimplementsSubject{
privateListobservers;
privateStringmessage;
publicNotice(){
observers=newArrayList();
}
@Override
publicvoidregisterObserver(Observerobserver){
//TODO自动生成的方法存根
if(!
observers.contains(observer))
observers.add(observer);
}
@Override
publicvoidremoveObserver(Observerobserver){
//TODO自动生成的方法存根
if(observers.contains(observer))
observers.remove(observer);
}
@Override
publicvoidnotifyAllObservers(){
//TODO自动生成的方法存根
for(Iteratorit=observers.iterator();it.hasNext();){
Observero=it.next();
o.getNotice(getMessage());
}
}
publicvoidsetMessage(Stringstr){
this.message=str;
}
publicStringgetMessage(){
returnmessage;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;
//学院通知
publicclassDepartmentNoticeimplementsSubject{
privateListobservers;
privateStringmessage;
publicDepartmentNotice(){
observers=newArrayList();
}
@Override
publicvoidregisterObserver(Observerobserver){
//TODO自动生成的方法存根
observers.add(observer);
}
@Override
publicvoidremoveObserver(Observerobserver){
//TODO自动生成的方法存根
observers.remove(observer);
}
@Override
publicvoidnotifyAllObservers(){
//TODO自动生成的方法存根
for(Iteratorit=observers.iterator();it.hasNext();){
Observero=it.next();
o.getNotice(getMessage());
}
}
publicvoidsetMessage(Stringstr){
this.message=str;
}
publicStringgetMessage(){
returnmessage;
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
//观察者
publicinterfaceObserver{
publicvoidgetNotice(Stringmessage);
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
//具体观察者,教师
publicclassTeacherimplementsObserver{
@Override
publicvoidgetNotice(Stringmessage){
//TODO自动生成的方法存根
System.out.println("教师收到通知:
"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
//具体观察者,学生
publicclassStudentimplementsObserver{
@Override
publicvoidgetNotice(Stringmessage){
//TODO自动生成的方法存根
System.out.println("学生收到通知:
"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
//具体观察者,行政人员
publicclassAdministratorimplementsObserver{
@Override
publicvoidgetNotice(Stringmessage){
//TODO自动生成的方法存根
System.out.println("行政人员收到通知:
"+message);
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
packagecourse.observer.notice;
//测试程序
publicclassTest{
/**
*@paramargs
*/