java实验策略模式观察者模式和组合模式_第1页
java实验策略模式观察者模式和组合模式_第2页
java实验策略模式观察者模式和组合模式_第3页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验二策略模式、观察者模式和组合模式一、实验目的:1学习和掌握策略模式;2学习和掌握观察者模式;3学习和掌握组合模式;4学习和掌握使用这些模式解决实际问题;二、实验内容1请使用策略模式实现以下编程要求:几何形状家族有圆形、矩形、椭圆 形、三角形等形状。请用Java语言定义一个抽象类MyShape表示形状这样概念, MyShapett象类中提供了计算面积、周长、显示形状信息的抽象方法,然后分别 定义它的子类 MyCircle 圆形、MyRectangle 矩形、MyEllipse 椭圆形、 MyTriangle 三角形等特定几何形状。并绘制这些定义的几何家族的所有形状。2 请用观察者模式实现功能

2、:学校发布信息,学生可以订阅,老师可以订阅, 行政人员也可以订阅。提示:定义主题接口,观察者接口,定义Notice、学生、老师和行政人员类,定义测试类。其中 Notice类实现主题接口,老师、学生和 行政人员实现观察者接口。思考,如果要求实现学生和老师均可以订阅多个信息, 即除了订阅学校发布信息,也可以订阅所属系发送的信息,请编程实现。3定义一个游戏地图。地图是由每个方块拼合起来。地图上有墙等障碍物,也 有可以通行的根本图元构成。请使用组合模式,绘制一个游戏地图,地图的内容 自行定义,也可以类似图3形式:图3游戏地图4有一个二维数组数据如图1所示,请结合策略模式、观察者模式和组合 模式实现一个

3、MVC结构的应用程序。要求:如果用户移动滑块,可以修改二维数 组的值,并在运行的用户界面中显示出来。 其中,饼状图和柱状图中的区域分布 为二位数组每一维的总和。运行结果如图 4和图5所示。605090904030102070图4数据模型图5运行结果三、实验环境1、PC微机;2、DO操作系统或Windows操作系统;3、jdk程序集成环境Eclipse四、源代码、测试结果及 UML图一:1.UML 图DrawShape-shapesList<MyShape>+DrawShape() +addShape(shape:MyShap e):void+paintComponent(g:Gr

4、aphics):voidMyShape+area():float +perimeter():float +draw(g:Graphics): voidMyCircle-PI:float=3.14f -radius:i nt-x:i nt-y:i nt +MyCircle(x:i nt,y: in t,radius:i nt) +area():float +perimeter():float +draw(g:Graphics) :void+toStri ng():Stri ngMyRecta ngleMyEllipse-width:i nt-Pl:float=3.14f-height:i nt-

5、aL on g:i nt-x:i nt-bShort:i nt-y:i nt-x:i nt-y:i nt+MyRecta ngle(widt+MyEllipse(aL on g:i nh:i nt,height:i nt,x:i nt,t,bShort:i nt,x:i nt,y:i nty:i nt)+area():float+area():float+perimeter():float+perimeter():float+draw(g:Graphics):+draw(g:Graphics):vvoidoid+toStri ng():Stri ng+toStri ng():Stri ngMy

6、Tria ngle-xPoi nts:i nt -yPoi nts:i nt -a:i nt -b:i nt -c:i nt -n:i nt +MyTria ngle(xPoin ts:i nt,yPoi nts:i nt, a:i nt,b:i nt,c:i nt, n:i nt )+area():float +perimeter():float +draw(g:Graphics): void+toStri ng():Stri ng2. 源程序代码:package course.strategy.shape; import java.awt.Graphics;import java.util

7、.ArrayList;import java.util.List;import javax.swi ng.JPa nel;/绘制所有图形SuppressWar nin gs("serial") public class DrawShape exte nds JPa nel private List<MyShape> shapes;public DrawShape() shapes=new ArrayList<MyShape>();public void addShape(MyShape shape) / if(shape!=n ull) shapes

8、.add(shape);添加图形public void pain tComp onen graphics g)/for(MyShape ms:shapes)ms.draw(g);System.out.pri ntl n( ms);、 package course.strategy.shape;import java.awt.Graphics;/形状家族依次绘制图形public abstractclassMyShape publicabstractfloatarea();publicabstractfloatperimeter();publicabstractvoiddraw(Graphics

9、g)package course.strategy.shape;import java.awt.Color;import java.awt.Graphics;/圆形public class MyCircle exte nds MyShape private static final float Pl=3.14f;private int radius; /定义圆形半径private int x,y; /定义起点(x,y )坐标public MyCircle(i nt x,i nt y,i nt radius) / super();this.x=x;this.y=y;this.radius = r

10、adius;Overridepublic float area() II/ TODO自动生成的方法存根 return Pl*radius*radius;构造函数求面积Overridepublic float perimeter() II求周长/ TODO自动生成的方法存根return 2*PI*radius;Overridepublic Stri ng toStri ng() 坐标="+ yreturn "MyCircle radius=" + radius + ", x坐标="+ x + ", y+ ""+&qu

11、ot;面积="+area()+",周长="+perimeter();Overridepublic void draw(Graphics g) /绘制图形/ TODO自动生成的方法存根g.setColor(Color.blue);g.fillOval(x, y, 2*radius, 2*radius);、'package course.strategy.shape;import java.awt.Color;import java.awt.Graphics;/矩形public class MyRecta ngle exte nds MyShape priva

12、te int x,y;/定义起点(x,y )坐标private int width,height; /定义矩形的宽和高public MyRecta ngle(i nt x,i nt y,i nt width, int height) super();this.x=x;this.y=y;this.width = width;this.height = height;Overridepublic float area() / TODO自动生成的方法存根retur n width*height;Overridepublic float perimeter() / TODO自动生成的方法存根retur

13、n 2*(width+height);Override+ width周长public Stri ng toStri ng() return "MyRecta ngle x 坐标="+ x + ", y 坐标="+ y + ", 矩形宽=" + ", 矩形高="+ height + ""+" 面积="+area()+" ="+perimeter();Overridepublic void draw(Graphics g) / TODO自动生成的方法存根g.s

14、etColor(Color.gree n);g.fillRect(x, y, width, height);、package course.strategy.shape;import java.awt.Color;import java.awt.Graphics;/椭圆形public class MyEllipse exte nds MyShape private static final float Pl=3.14f;private int x,y;/定义起点(x,y )坐标private int aLo ng,bShort;/定义椭圆的长轴和短轴public MyEllipse( int

15、x, i nt y,i nt aLo ng, i nt bShort) super();this.x = x;this.y = y;this.aL ong = aLong; this.bShort = bShort;Overridepublic float area() / TODO自动生成的方法存根return 1.0f/4*PI*aL on g*bShort;Overridepublic float perimeter() / TODO自动生成的方法存根return PI*bShort+2*(aLo ng-bShort);Overridepublic Stri ng toStri ng()

16、 return "MyEllipse x 坐标="+ x + ", y 坐标="+ y + ", 长轴="+ aLong+ ", 短轴="+ bShort + ""+"面积="+area()+", 周长="+perimeter();Overridepublic void draw(Graphics g) / TODO自动生成的方法存根g.setColor(Color.red);g.fillOval(x, y, aLo ng, bShort);、packag

17、e course.strategy.shape;import java.awt.Color;import java.awt.Graphics;/三角形public class MyTria ngle exte nds MyShape private int a,b,c, n;private in t xPo in ts;private in t yPo in ts;public MyTria ngle( in t xPo in ts, in t yPo in ts,i nt n ,i nt a,i nt b,i nt c) super();this.xPoi nts = xPoi nts;th

18、is.yPoi nts = yPoi nts;this. n = n;this.a=a; this.b=b; this.c=c;Overridepublic float area() / TODO自动生成的方法存根float p=(a+b+c)/2;return (float)Math.sqrt(p*(p_a)*(p_b)*(p_c);Overridepublic float perimeter() / TODO自动生成的方法存根retur n a+b+c;Overridepublic Stri ng toStri ng() return "MyTria ngle a="

19、+ a + ", b=" + b + ", c=" + c + ""+"面积="+area()+",周长="+perimeter();Overridepublic void draw(Graphics g) / TODO自动生成的方法存根 g.setColor(Color.yellow);g.fillPolygo n(xPoi nts, yPo in ts, n); package course.strategy.shape; import javax.swing.JFrame;/测试绘制所有形

20、状/测试程序public class Test * paramargs*/public static void main(String args) / TOD O自动生成的方法存根JFrame frame= new JFrame();DrawShape ds= new DrawShape();ds.addShape(new MyCircle(20,20,60);ds.addShape(new MyRecta ngle(200,20,120,100);ds.addShape(new MyEllipse(40,200,150,100);int xPoints=300,240,370;int yPo

21、ints=200,280,300;ds.addShape(new MyTria ngle(xPoi nts,yPoi nts,3,9,12,15);frame.getC onten tPa ne().add(ds);frame.setTitle("绘制图形演示);frame.setSize(500,400);EXIT_ON_CLOS Eframe.setVisible( true ); frame.setDefaultCloseOperatio n(J Frame.3. 测试结果图:=已握匸亠:2) "*a 庖年即罚 C:Program Al«和 aw 珂 re7

22、N 册 vaweio? ( 2Oj3-5-13 下牛7:19:4$ )Myfircle rsriiusOj x生标二7叭 y=?0|面积=11304珈H周怅訂7丘用00Myftectangle 趙标立刚 y坐标二込 距邮宜12P, 酬离=100 面积=12060,0,周匸-44(5.0 MyEllipse »(坐标_阳y里畅-2(3叭feft-iaojE1M-11775.001 jK-414.t)Myrriangl a=y, b二 1 打 clS 血帜二S4.0周也"SO:1.UML 图:2.源代码:package course.observer. no tice;/主题i

23、n terfaceSubject publicvoidregisterObserver(Observer observer);publicvoidremoveObserver(Observer observer);publicvoidn otifyAIIObservers();publicpackage course.observer. no tice;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/学校通知public class Notice impleme nts Subject pr

24、ivate List<Observer> observers;private String message;public Notice()observers=new ArrayList<Observer>();Overridepublic void registerObserver(Observer observer) / TODO自动生成的方法存根 if(!observers.c ontain s(observer)observers.add(observer);Overridepublic void removeObserver(Observer observer)

25、 / TODO自动生成的方法存根if(observers.c ontain s(observer) observers.remove(observer);Overridepublic void no tifyAllObservers() / TODO自动生成的方法存根for(Iterator<Observer> it=observers.iterator();it.hasNext();)Observer o=it. next(); o.getNotice(getMessage();public void setMessage(Stri ng str)this.message=str

26、;public String getMessage()retur n message;、package course.observer. no tice;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/学院通知public class Departme ntNotice impleme nts Subject private List<Observer> observers;private String message;public Departme ntNotice()obse

27、rvers=new ArrayList<Observer>();Overridepublic void registerObserver(Observer observer) / TODO自动生成的方法存根observers.add(observer);Overridepublic void removeObserver(Observer observer) / TODO自动生成的方法存根observers.remove(observer);Overridepublic void no tifyAllObservers() / TODO自动生成的方法存根for(Iterator&l

28、t;Observer> it=observers.iterator();it.hasNext();) Observer o=it .n ext();o.getNotice(getMessage();public void setMessage(Stri ng str)this.message=str;public String getMessage()retur n message;package course.observer. no tice;/观察者public in terfaceObserver public void getNotice(String message);、 、

29、 、 、package course.observer. no tice;/具体观察者,教师public class Teacher implements Observer Overridepublic void getNotice(String message) / TOD O自动生成的方法存根System. out.println(教师收到通知:"+message); package course.observer. no tice;/具体观察者,学生public class Studentimplements Observer Overridepublic void getNo

30、tice(String message) / TOD O自动生成的方法存根System. out.println(学生收到通知:"+message); package course.observer. no tice;/具体观察者,行政人员public class Administratorimplements Observer Overridepublic void getNotice(String message) / TOD O自动生成的方法存根System. out.println(行政人员收到通知: "+message);、 、 、 、package course

31、.observer. no tice;/测试程序public class Test /*paramargs*/public static void main(String args) II TOD O自动生成的方法存根Notice no tice=new Notice。;Departme ntNotice depart=new Departme ntNotice();Observer tea,stu,adm in;tea= new Teacher();stu= new Stude nt();adm in=new Admi nistrator();no tice.registerObserver

32、(tea);no tice.registerObserver(stu);no tice.registerObserver(adm in);depart.registerObserver(tea);depart.registerObserver(stu);notice.setMessage("学校通知:五一全体放假七天。");depart.setMessage("学院通知:这个礼拜周末补课,请各位做好心里准备。");no tice .no tifyAllObservers();System.out .pri ntln();depart. no tifyAI

33、IObservers();System.out .pri ntln();no tice.removeObserver(tea);no tice .no tifyAllObservers();3.测试结果图:Test C 3 应用程痔匚Aprograrn FilesJavareAbinava( 2021-5-1:教师呱到通知:融通臥 五一全体放腹七可。T。学生收到通知:学梭通炖:五一全体放假七天行政人员收到通知匚学檢通知;五一全体放假七天教师收到通知:学院通知:这个礼拜周末补课请各位俶好心里准备 学生收到通知:学院通知:这个礼拜周末补裸F请各位做好心里淮瞥学生收到通知;学校通村:五一全怵放傩七天

34、行政人员收到通知匕学校通知:五一全体敖假七夭1. UML 图2. 源代码package course posite.gameMap;import java.awt.Dime nsion;import java.awt.Graphics;import javax.swi ng.JPa nel;SuppressWar nin gs("serial")public abstract class GameComp onent exte nds JPa nel public abstract void pain tComp onen t(Graphics g); public Dim

35、e nsi on getPreferredSize() retur n new Dime nsion(50,50);、package course posite.gameMap;import java.awt.Graphics;import java.awt.Image;import javax.swi ng.BorderFactory;import javax.sw ing.lm ageIc on;SuppressWar nin gs("serial")public class Grass exte nds GameComp onent private ImageIc o

36、n icon;private Image image;public Grass()setBorder(BorderFactory.createEmptyBorder(); icon=new ImageIc on ("src/images/grass.jpg"); image=ic on. getlmage();Overridepublic void pain tComp onen t(Graphics g) / TODO自动生成的方法存根 g.drawlmage(image,O,O,getWidth(),getHeight(),this); package course p

37、osite.gameMap; import java.awt.Graphics;import java.awt.Image;import javax.sw ing.lm ageIc on;SuppressWar nin gs("serial") public class House exte nds GameComp onent private ImageIc on icon; private Image image;public House()icon=new ImageIc on ("src/images/house.jpg"); image=ic

38、on. getImage();Overridepublic void pain tComp onen t(Graphics g) / TODO自动生成的方法存根g.drawlmage(image,O,O,getWidth(),getHeight(),this); 、package course posite.gameMap;import java.awt.Graphics;import java.awt.Image;import javax.swing.lmageIcon;SuppressWar nin gs( "serial" )public class Tree ext

39、ends GameComponent private ImageIcon icon ;private Image image;public Tree()icon =new Imagelcon( "src/images/tree.jpg" ); image=icon .getlmage();Overridepublic void paintComponent(Graphics g) / TOD O自动生成的方法存根g.drawImage( image,O,O,getWidth(),getHeight(),this ); package course posite.gameMa

40、p;import java.awt.Graphics;import java.awt.Image;import java.io.File;import javax.imagei o.Im ageIO;import javax.sw ing.lm ageIc on;SuppressWar nin gs("serial")public class Wall exte nds GameComp onentprivate ImageIc on icon;private Image image;public Wall()icon=new ImageIco n( "src/i

41、mages/wall.jpg"); image=ic on. getImage();Overridepublic void pain tComp onen t(Graphics g) / TODO自动生成的方法存根tryimage=ImageIO.read( new File("src/images/wall.jpg"); g.drawlmage(image,O,O,getWidth(),getHeight(),this);catch(Excepti on e)e.pri ntStackTrace(); package course posite.gameMap;

42、import java.awt.Graphics;import java.awt.Image;import javax.sw ing.lm ageIc on;SuppressWar nin gs("serial") public class Road exte nds GameComp onent private Imagelc on icon;private Image image;public Road()icon=new ImageIc on ("src/images/road.jpg"); image=ic on. getImage();Over

43、ridepublic void pain tComp onen t(Graphics g) / TODO自动生成的方法存根g.drawlmage(image,O,O,getWidth(),getHeight(),this); 、package course posite.gameMap;import java.awt.Color;import java.awt.C ontainer;import java.awt.GridLayout;import javax.swi ng.JFrame;/测试程序SuppressWar nin gs("serial")public cla

44、ss Test exte nds JFrame private GridLayout layout;private in t map=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,130,0,2,0,0,0,0,0,2,0,0,3,1,130,0,0,1,1,3,1,1,0,0,0,3,1,1,0,0,4,0,0,0,0,0,0,0,4,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,0,1,0,030,0,0,3,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1

45、,1,0,0,4,0,0,1,3,1,0,0,4,0,0,1,1,0,0,0,1,1,1,3,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,3,3,3,0,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,2,0,0,0,4,3,4,3,4,0,0,0,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;public Test()super("游戏地图演示");Container contain er=getC onten tPa ne();layout =n

46、ew GridLayout(15,15);/设置15行*15列的网格布局设置窗口背景颜色contain er.setLayout(layout); Color c=new Color(60,90,0);contain er.setBackgro un d(c);/for(i nt i=0;i<layout.getRows();i+)for(i nt j=0;j<layout.getColu mn s();j+) switch(mapij)case 0:c ontain er.add( new Road();break; case 1:c ontain er.add( new Wal

47、l();break;case 2:c ontain er.add( new House();break; case 3:c ontain er.add( new Grass();break; case 4:c ontain er.add( new Tree();break;setSize(600,600); setVisible(true);/* param args*/public static void main( Stri ng args) / TODO自动生成的方法存根Test t=new Test();t.setDefaultCloseOperati on (JFrame.EXIT_

48、ON_CLOSE); 3. 测试结果图s- lcML 函View+addView(v:View)void +removeView(v:View) void+update(data:int):void7TiIModel+setData(index:int,value:in t):void+getData():int +addObserver(o:View):voi d+removeObserver(o:View):void+notifyObservers():void2.源代码package course.MVC;public in terfaceModel public void setDat

49、a( int index, int value);public int getData();public void addObserver(View o);public void removeObserver(View o);public void notifyObservers(); package course.MVC;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/数据模型public class DataModel impleme nts Model private int data

50、; /一维数组private List<View> observers; /观察者public DataModel()observers=new ArrayList<View>();data=new in t9;for(i nt i=0;i<dataen gth;i+)datai=5;Overridepublic void setData(i nt in dex, int value) / TODO自动生成的方法存根this.datai ndex=value;no tifyObservers();Overridepublic void addObserver(Vi

51、ew o) / TODO自动生成的方法存根if (o = n ull)throw new NullPoi nterExceptio n(); if (!observers.c ontain s(o)observers.add(o);Overridepublic void removeObserver(View o) / TODO自动生成的方法存根if(observers.c ontain s(o) observers.remove(o);Overridepublic void no tifyObservers() / TODO自动生成的方法存根for(lterator<View>

52、it=observers.iterator();it.hasNext();) View observer=it .n ext();observer.update(this.data);Overridepublic in t getData() / TODO自动生成的方法存根return data;、package course.MVC;/添加视图/删除视图public in terfaceView public abstractvoid addView(View v);public abstractvoid removeView(View v);/更新视图public abstract voi

53、d update( int data);package course.MVC;import java.awt.Color;import java.awt.Graphics;import javax.swi ng.JPa nel;/表格图SuppressWar nin gs("serial")public class TableView exte nds JPa nel impleme nts View private in t data=60,50,90,90,40,30,10,20,70;private static final int startX=20;private static final int startY=20;public void pain tComp onen t(Graphics g)super.pa in tComp onen t(g);for(i nt i=0;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论