2022年java实验策略规划模式观察者模式和组合模式.pdf

上传人:C****o 文档编号:12838332 上传时间:2022-04-26 格式:PDF 页数:28 大小:1.39MB
返回 下载 相关 举报
2022年java实验策略规划模式观察者模式和组合模式.pdf_第1页
第1页 / 共28页
2022年java实验策略规划模式观察者模式和组合模式.pdf_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《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); 、 、 、 、 、 、 、 、 、

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁