《2022年java实验策略规划模式观察者模式和组合模式.pdf》由会员分享,可在线阅读,更多相关《2022年java实验策略规划模式观察者模式和组合模式.pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验二策略模式、观察者模式和组合模式一、实验目的:(1)学习和掌握策略模式;(2)学习和掌握观察者模式;(3)学习和掌握组合模式;(4)学习和掌握使用这些模式解决实际问题;二、实验内容1. 请使用策略模式实现下列编程要求:已知几何形状家族有圆形、矩形、椭圆形、三角形等形状。 请用 Java语言定义一个抽象类MyShape表示形状这样概念,MyShape抽象类中提供了计算面积、 周长、显示形状信息的抽象方法, 然后分别定义它的子类 MyCircle (圆形) 、MyRectangle(矩形) 、MyEllipse (椭圆形)、MyTriangle(三角形)等特定几何形状。 并绘制这些定义的几何家
2、族的所有形状。2请用观察者模式实现功能:学校发布信息,学生可以订阅,老师可以订阅,行政人员也可以订阅。提示:定义主题接口,观察者接口,定义Notice、学生、老师和行政人员类,定义测试类。其中Notice 类实现主题接口,老师、学生和行政人员实现观察者接口。 思考, 如果要求实现学生和老师均可以订阅多个信息,即除了订阅学校发布信息,也可以订阅所属系发送的信息,请编程实现。3定义一个游戏地图。地图是由每个方块拼合起来。地图上有墙等障碍物,也有可以通行的基本图元构成。 请使用组合模式, 绘制一个游戏地图, 地图的内容自行定义,也可以类似图3 形式:精品资料 - - - 欢迎下载 - - - - -
3、 - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 28 页 - - - - - - - - - - 图 3 游戏地图4已知有一个二维数组数据如图1 所示,请结合策略模式、观察者模式和组合模式实现一个 MVC 结构的应用程序。要求:如果用户移动滑块,可以修改二维数组的值, 并在运行的用户界面中显示出来。其中,饼状图和柱状图中的区域分布为二位数组每一维的总和。运行结果如图4 和图 5 所示。60 50 90 90 40 30 10 20 70 图 4 数据模型图 5 运行结果精品资料 - - - 欢迎下载 - - - - - - - - - - -
4、 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 28 页 - - - - - - - - - - 三、实验环境1、PC 微机;2、DOS 操作系统或 Windows 操作系统;3、jdk 程序集成环境 Eclipse 四、源代码、测试结果及UML 图一:1.UML 图DrawShape-shapes: List+DrawShape()+addShape(shape:MyShape):void+paintComponent(g:Graphics):voidMyShape+area():float+perimeter():float+draw(g:Graphics):v
5、oidMyCircle-PI:float=3.14f-radius:int-x:int-y:int+MyCircle(x:int,y:int,radius:int)+area():float+perimeter():float+draw(g:Graphics):void+toString():StringMyRectangle-width:int-height:int-x:int-y:int+MyRectangle(width:int,height:int,x:int,y:int)+area():float+perimeter():float+draw(g:Graphics):void+toS
6、tring():StringMyEllipse-PI:float=3.14f-aLong:int-bShort:int-x:int-y:int+MyEllipse(aLong:int,bShort:int,x:int,y:int)+area():float+perimeter():float+draw(g:Graphics):void+toString():StringMyTriangle-xPoints:int-yPoints:int-a:int -b:int-c:int -n:int+MyTriangle(xPoints:int,yPoints:int,a:int,b:int,c:int,
7、n:int)+area():float+perimeter():float+draw(g:Graphics):void+toString():String2. 源程序代码:package course.strategy.shape; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; /绘制所有图形SuppressWarnings(serial) public class DrawShape extends JPanel private L
8、ist shapes; public DrawShape() shapes=new ArrayList(); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 3 页,共 28 页 - - - - - - - - - - public void addShape(MyShape shape) /添加图形if(shape!=null) shapes.add(shape); public void paintComponent(Graphics g) /依次绘制图形for(MyShape ms:shapes)
9、ms.draw(g); System.out.println(ms); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.strategy.shape; import java.awt.Graphics; /形状家族public abstract class MyShape public abstract
10、 float area(); public abstract float perimeter(); public abstract void draw(Graphics g); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.strategy.shape; import java.awt.Color;
11、import java.awt.Graphics; /圆形public class MyCircle extends MyShape private static final float PI=3.14f; private int radius; /定义圆形半径private int x,y; /定义起点( x,y)坐标public MyCircle(int x,int y,int radius) /构造函数super(); this.x=x; this.y=y; this.radius = radius; Override public float area() /求面积/ TODO 自动生
12、成的方法存根return PI*radius*radius; Override public float perimeter() /求周长精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 28 页 - - - - - - - - - - / TODO 自动生成的方法存根return 2*PI*radius; Override public String toString() return MyCircle radius= + radius + , x坐标 = + x + , y 坐标 = + y
13、 + + 面积 =+area()+, 周长 =+perimeter(); Override public void draw(Graphics g) /绘制图形/ TODO 自动生成的方法存根g.setColor(Color.blue); g.fillOval(x, y, 2*radius, 2*radius); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
14、、 、 、 、 、 、 、 、package course.strategy.shape; import java.awt.Color; import java.awt.Graphics; /矩形public class MyRectangle extends MyShape private int x,y; /定义起点( x,y)坐标private int width,height; /定义矩形的宽和高public MyRectangle(int x,int y,int width, int height) super(); this.x=x; this.y=y; this.width =
15、width; this.height = height; Override public float area() / TODO 自动生成的方法存根return width*height; Override public float perimeter() / TODO 自动生成的方法存根return 2*(width+height); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 28 页 - - - - - - - - - - Override public String toStrin
16、g() return MyRectangle x 坐标 = + x + , y坐标 = + y + , 矩形宽 = + width + , 矩形高 = + height + + 面积 =+area()+, 周长 =+perimeter(); Override public void draw(Graphics g) / TODO 自动生成的方法存根g.setColor(Color.green); g.fillRect(x, y, width, height); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
17、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.strategy.shape; import java.awt.Color; import java.awt.Graphics; /椭圆形public class MyEllipse extends MyShape private static final float PI=3.14f; private int x,y; /定义起点( x,y)坐标private int aLong,bS
18、hort; /定义椭圆的长轴和短轴public MyEllipse(int x, int y,int aLong, int bShort) super(); this.x = x; this.y = y; this.aLong = aLong; this.bShort = bShort; Override public float area() / TODO 自动生成的方法存根return 1.0f/4*PI*aLong*bShort; Override public float perimeter() / TODO 自动生成的方法存根return PI*bShort+2*(aLong-bSh
19、ort); Override public String toString() 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 28 页 - - - - - - - - - - return MyEllipse x坐标 = + x + , y 坐标 = + y + , 长轴 = + aLong + , 短轴= + bShort + + 面积 =+area()+, 周长 =+perimeter(); Override public void draw(Graphics g) / TODO 自动生
20、成的方法存根g.setColor(Color.red); g.fillOval(x, y, aLong, bShort); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.strategy.shape; import java.awt.Color; import java.awt.Graphics; /
21、三角形public class MyTriangle extends MyShape private int a,b,c,n; private int xPoints; private int yPoints; public MyTriangle( int xPoints, int yPoints,int n,int a,int b,int c) super(); this.xPoints = xPoints; this.yPoints = yPoints; this.n = n; this.a=a; this.b=b; this.c=c; Override public float area
22、() / TODO 自动生成的方法存根float p=(a+b+c)/2; return (float)Math.sqrt(p*(p-a)*(p-b)*(p-c); Override public float perimeter() / TODO 自动生成的方法存根return a+b+c; Override public String toString() return MyTriangle a= + a + , b= + b + , c= + c + + 面积 =+area()+, 周长 =+perimeter(); 精品资料 - - - 欢迎下载 - - - - - - - - - -
23、- 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 28 页 - - - - - - - - - - Override public void draw(Graphics g) / TODO 自动生成的方法存根g.setColor(Color.yellow); g.fillPolygon(xPoints, yPoints, n); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
24、、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.strategy.shape; import javax.swing.JFrame; /测试程序public class Test /测试绘制所有形状/* param args*/public static void main(String args) / TODO自动生成的方法存根JFrame frame=new JFrame(); DrawShape ds=new DrawShape(); ds.addShape(new MyCircle(20,20,60); ds.addShape(n
25、ew MyRectangle(200,20,120,100); ds.addShape(new MyEllipse(40,200,150,100); int xPoints=300,240,370; int yPoints=200,280,300; ds.addShape(new MyTriangle(xPoints,yPoints,3,9,12,15); frame.getContentPane().add(ds); frame.setTitle( 绘制图形演示 ); frame.setSize(500,400); frame.setVisible( true); frame.setDefa
26、ultCloseOperation(JFrame. EXIT_ON_CLOSE ); 3. 测试结果图:精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 28 页 - - - - - - - - - - 二:1.UML 图:Subject+registerObserver(observer:Observer):void+removeObserver(observer:Observer):void+notifyAllObservers():voidObserver+getNotice(messag
27、e:String):voidDepartmentNotice-observers:List-message:String+DepartmentNotice()+registerObserver(observer:Observer):void+removeObserver(observer:Observer):void+notifyAllObservers():void+setMessage(str:String):void+getMessage():StringNotice-observers:List-message:String+Notice()+registerObserver(obse
28、rver:Observer):void+removeObserver(observer:Observer):void+notifyAllObservers():void+setMessage(str:String):void+getMessage():StringTeacher+getNotice(message:String):voidStudent+getNotice(message:String):voidAdministrator+getNotice(message:String):void精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳
29、- - - - - - - - - -第 9 页,共 28 页 - - - - - - - - - - 2.源代码:package course.observer.notice; /主题public interface Subject public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyAllObservers(); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
30、、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.observer.notice; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /学校通知public class Notice implements Subject private List observers; private String me
31、ssage; public Notice() observers=new ArrayList(); Override public void registerObserver(Observer observer) / TODO 自动生成的方法存根if(!observers.contains(observer) observers.add(observer); Override public void removeObserver(Observer observer) / TODO 自动生成的方法存根if(observers.contains(observer) observers.remove
32、(observer); Override public void notifyAllObservers() / TODO 自动生成的方法存根for(Iterator it=observers.iterator();it.hasNext();) Observer o=it.next(); o.getNotice(getMessage(); public void setMessage(String str) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 28 页 - - - - - - -
33、- - - this.message=str; public String getMessage() return message; 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.observer.notice; import java.util.ArrayList; import java.util
34、.Iterator; import java.util.List; /学院通知public class DepartmentNotice implements Subject private List observers; private String message; public DepartmentNotice() observers=new ArrayList(); Override public void registerObserver(Observer observer) / TODO 自动生成的方法存根observers.add(observer); Override publ
35、ic void removeObserver(Observer observer) / TODO 自动生成的方法存根observers.remove(observer); Override public void notifyAllObservers() / TODO 自动生成的方法存根for(Iterator it=observers.iterator();it.hasNext();) Observer o=it.next(); o.getNotice(getMessage(); public void setMessage(String str) this.message=str; pub
36、lic String getMessage() return message; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 11 页,共 28 页 - - - - - - - - - - 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、pa
37、ckage course.observer.notice; /观察者public interface Observer public void getNotice(String message); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.observer.notice; /具体观察者,教师pub
38、lic class Teacher implements Observer Overridepublic void getNotice(String message) / TODO自动生成的方法存根System.out.println( 教师收到通知:+message); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、packag
39、e course.observer.notice; /具体观察者,学生public class Student implements Observer Overridepublic void getNotice(String message) / TODO自动生成的方法存根System.out.println( 学生收到通知:+message); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
40、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.observer.notice; /具体观察者,行政人员public class Administrator implements Observer Overridepublic void getNotice(String message) / TODO自动生成的方法存根System.out.println( 行政人员收到通知:+message); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
41、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package course.observer.notice; /测试程序public class Test /* param args精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 12 页,共 28 页 - - - - - - - - - - */public static void main(String args) / TODO自动生成的方
42、法存根Notice notice= new Notice(); DepartmentNotice depart= new DepartmentNotice(); Observer tea,stu,admin; tea=new Teacher(); stu=new Student(); admin=new Administrator(); notice.registerObserver(tea); notice.registerObserver(stu); notice.registerObserver(admin); depart.registerObserver(tea); depart.r
43、egisterObserver(stu); notice.setMessage(学校通知:五一全体放假七天。 。 。); depart.setMessage(学院通知:这个礼拜周末补课,请各位做好心里准备。 。); notice.notifyAllObservers(); System.out.println(); depart.notifyAllObservers(); System.out.println(); notice.removeObserver(tea); notice.notifyAllObservers(); 3.测试结果图:精品资料 - - - 欢迎下载 - - - - -
44、 - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 13 页,共 28 页 - - - - - - - - - - 三: 1.UML 图GameComponent+paintComponent(g:Graphics):void+getPreferredSize():DimensionGrass-icon:ImageIcon-image:Image+Grass()+paintComponent(g:Graphics):voidTree-icon:ImageIcon-image:Image+Tree()+paintComponent(g:Graphics):vo
45、idRoad-icon:ImageIcon-image:Image+Road()+paintComponent(g:Graphics):voidHouseWall-icon:ImageIcon-image:Image+House()+paintComponent(g:Graphics):void-icon:ImageIcon-image:Image+Wall()+paintComponent(g:Graphics):void2.源代码package posite.gameMap; import java.awt.Dimension; import java.awt.Graphics; impo
46、rt javax.swing.JPanel; SuppressWarnings(serial) public abstract class GameComponent extends JPanel public abstract void paintComponent(Graphics g); public Dimension getPreferredSize() return new Dimension(50,50); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、
47、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package posite.gameMap; import java.awt.Graphics; import java.awt.Image; import javax.swing.BorderFactory; import javax.swing.ImageIcon; SuppressWarnings(serial) public class Grass extends GameComponent private ImageIcon icon; 精品资料 - - - 欢迎下载 - - - - -
48、 - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 14 页,共 28 页 - - - - - - - - - - private Image image; public Grass() setBorder(BorderFactory.createEmptyBorder(); icon=new ImageIcon(src/images/grass.jpg); image=icon.getImage(); Override public void paintComponent(Graphics g) / TODO 自动生成的方法存根g.drawImage(im
49、age,0,0,getWidth(),getHeight(),this); 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、package posite.gameMap; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; SuppressWarnings(serial)
50、 public class House extends GameComponent private ImageIcon icon; private Image image; public House() icon=new ImageIcon(src/images/house.jpg); image=icon.getImage(); Override public void paintComponent(Graphics g) / TODO 自动生成的方法存根g.drawImage(image,0,0,getWidth(),getHeight(),this); 、 、 、 、 、 、 、 、 、