java实验策略模式、观察者模式和组合模式_第1页
java实验策略模式、观察者模式和组合模式_第2页
java实验策略模式、观察者模式和组合模式_第3页
免费预览已结束,剩余31页可下载查看

下载本文档

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

文档简介

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

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

3、地图4已知有一个二维数组数据如图 1 所示,请结合策略模式、观察者模式和组合 模式实现一个 MVC 结构的应用程序。要求:如果用户移动滑块,可以修改二维 数组的值, 并在运行的用户界面中显示出来。 其中,饼状图和柱状图中的区域分 布为二位数组每一维的总和。运行结果如图 4和图 5所示。605090904030102070图4 数据模型图 5 运行结果三、实验环境1、PC微机;2、DOS操作系统或 Windows 操作系统;3、jdk 程序集成环境 Eclipse四、源代码、测试结果及 UML 图一: 1.UML 图DrawShape -shapes:List +DrawShape() +add

4、Shape(shape:MyShap e):void +paintComponent(g:Gr aphics):voidMyShape+area():float +perimeter():float +draw(g:Graphics): voidMyCircle -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():StringMyRectangleMyEll

5、ipse-width:int-PI:float=3.14f-height:int-aLong:int-x:int-bShort:int-y:int-x:int-y:int+MyRectangle(widt+MyEllipse(aLong:inh:int,height:int,x:int,t,bShort:int,x:int,y:inty:int)+area():float+area():float+perimeter():float+perimeter():float+draw(g:Graphics):+draw(g:Graphics):vvoidoid+toString():String+t

6、oString():StringMyTriangle -xPoints:int -yPoints:int -a:int -b:int -c:int -n:int +MyTriangle(xPoin ts:int,yPoints:int, a:int,b:int,c:int,n:int ) +area():float +perimeter():float +draw(g:Graphics): void +toString():String2. 源程序代码:package course.strategy.shape;import java.awt.Graphics;import java.util

7、.ArrayList;import java.util.List;import javax.swing.JPanel;/绘制所有图形SuppressWarnings(serial) public class DrawShape extends JPanel private List shapes;public DrawShape() shapes=new ArrayList();public void addShape(MyShape shape)/添加图形if(shape!=null) shapes.add(shape);public void paintComponent(Graphics

8、 g)/依次绘制图形for(MyShape ms:shapes)ms.draw(g);System.out.println(ms);package course.strategy.shape;import java.awt.Graphics;/形状家族public abstract class MyShape public abstract float area();public abstract float perimeter();public abstract void draw(Graphics g); package course.strategy.shape;import java.

9、awt.Color;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;Overridepublic String toString() retur

10、n MyCircle radius= + radius + , x 坐标 = + x + , y 坐标 = + y + + 面积 =+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;/矩形publi

11、c 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 = width;this.height = height;Overridepublic float perimeter() / TODO 自动生成的方法存根return 2*(width+height);Overri

12、depublic String toString() return MyRectangle x 坐标 = + x + , y 坐标 = + y + , 矩形宽 = + width+ , 矩形高 = + height + + 面积 =+area()+, 周长 =+perimeter();Overridepublic void draw(Graphics g) / TODO 自动生成的方法存根 g.setColor(Color.green); g.fillRect(x, y, width, height);、package course.strategy.shape;import java.awt

13、.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,bShort; / 定义椭圆的长轴和短轴public MyEllipse(int x, int y,int aLong, int bShort) super();this.x = x;this.y = y;this.aLong = aLong;this.bShort = bShor

14、t;Override public String toString() return MyEllipse x 坐标 = + x + , y 坐标 = + y + , 长轴 = + aLong+ , 短轴 = + bShort + +面积 =+area()+, 周长 =+perimeter();Overridepublic void draw(Graphics g) / TODO 自动生成的方法存根 g.setColor(Color.red); g.fillOval(x, y, aLong, bShort);、package course.strategy.shape;import java.a

15、wt.Color;import java.awt.Graphics;/三角形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=

16、c;Overridepublic String toString() return MyTriangle a= + a + , b= + b + , c= + c + + 面积 =+area()+, 周长 =+perimeter(); Override public void draw(Graphics g) / TODO 自动生成的方法存根 g.setColor(Color.yellow); g.fillPolygon(xPoints, yPoints, n);package course.strategy.shape;import javax.swing.JFrame;/测试绘制所有形状/

17、测试程序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(new MyRectangle(200,20,120,100);ds.addShape(new MyEllipse(40,200,150,100);int xPoints=300,240,370;int yPoint

18、s=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.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE ); 3. 测试结果图: 1.UML 图:SubjectObserver+registerObserver(ob server:Observer):

19、void +removeObserver(ob server:Observer):void +notifyAllObservers( ):void+getNotice(message:String):voidDepartmentNoticeNotice-observers:List-message:String-observers:List-message:String+DepartmentNotice() +registerObserver(obser ver:Observer):void +removeObserver(obser ver:Observer):void +notifyAll

20、Observers():v oid+setMessage (str:String):void +getMessage():String+Notice() +registerObserver(obser ver:Observer):void +removeObserver(obser ver:Observer):void +notifyAllObservers():v oid+setMessage (str:String):void +getMessage():StringTeacherStudent+getNotice(mess age:String):void+getNotice(mess

21、age:String):void+getNotice(mess age:String):voidAdministrator2.源代码:package course.observer.notice;/主题public interface Subject public void registerObserver(Observer observer); public void removeObserver(Observer observer); public void notifyAllObservers();package course.observer.notice;import java.ut

22、il.ArrayList;import java.util.Iterator;import java.util.List;/学校通知public class Notice implements Subject private List observers;private String message;public Notice()observers=new ArrayList();Overridepublic void removeObserver(Observer observer) / TODO 自动生成的方法存根if(observers.contains(observer) observ

23、ers.remove(observer);Overridepublic 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;public String getMessage()return message;、package course.observer.notice;i

24、mport java.util.ArrayList;import java.util.Iterator;import java.util.List;/学院通知public class DepartmentNotice implements Subject private List observers;private String message;public DepartmentNotice()observers=new ArrayList();Overridepublic void registerObserver(Observer observer) / TODO 自动生成的方法存根obs

25、ervers.add(observer);Overridepublic void removeObserver(Observer observer) / TODO 自动生成的方法存根 observers.remove(observer);Overridepublic void notifyAllObservers() / TODO 自动生成的方法存根for(Iterator it=observers.iterator();it.hasNext();) Observer o=it.next();o.getNotice(getMessage();public void setMessage(Str

26、ing str)this.message=str;public String getMessage()return message;package course.observer.notice;/观察者public interface Observer public void getNotice(String message); package course.observer.notice; /具体观察者,教师 public class Teacher implements Observer Overridepublic void getNotice(String message) / TOD

27、O 自动生成的方法存根 System.out.println( 教师收到通知: +message);package course.observer.notice; /具体观察者,学生 public class Student implements Observer Overridepublic void getNotice(String message) / TODO 自动生成的方法存根System.out.println( 学生收到通知: +message);package course.observer.notice; /具体观察者,行政人员 public class Administra

28、tor implements Observer Overridepublic void getNotice(String message) / TODO 自动生成的方法存根System.out.println( 行政人员收到通知: +message); package course.observer.notice;/测试程序public class Test * param args*/public static void main(String args) / TODO 自动生成的方法存根Notice notice= new Notice();DepartmentNotice depart=

29、 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.registerObserver(stu);notice.setMessage(学校通知:五一全体放假七天。 。 ); dep

30、art.setMessage(学院通知: 这个礼拜周末补课, 请各位做好心里准备。 。); notice.notifyAllObservers();System.out.println();depart.notifyAllObservers();System.out.println();notice.removeObserver(tea);notice.notifyAllObservers();3.测试结果图: 1.UML 图2.源代码package posite.gameMap;import java.awt.Dimension;import java.awt.Graphics;import

31、 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);package posite.gameMap;import java.awt.Graphics;import java.awt.Image;import javax.swing.Bor

32、derFactory;import javax.swing.ImageIcon;SuppressWarnings(serial)public class Grass extends GameComponent private ImageIcon icon;private Image image;public Grass() setBorder(BorderFactory.createEmptyBorder(); icon=new ImageIcon(src/images/grass.jpg); image=icon.getImage();Overridepublic void paintCom

33、ponent(Graphics g) / TODO 自动生成的方法存根g.drawImage(image,0,0,getWidth(),getHeight(),this); package posite.gameMap;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;SuppressWarnings(serial)public class House extends GameComponent private ImageIcon icon;private Image image; publi

34、c 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); package posite.gameMap;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;SuppressWar

35、nings(serial )public class Tree extends GameComponent private ImageIcon icon;private Image image;public Tree()icon=new ImageIcon( src/images/tree.jpg ); image=icon.getImage();Overridepublic void paintComponent(Graphics g) / TODO 自动生成的方法存根g.drawImage(image,0,0,getWidth(),getHeight(), this ); package

36、posite.gameMap;import java.awt.Graphics;import java.awt.Image;import java.io.File;import javax.imageio.ImageIO;import javax.swing.ImageIcon;SuppressWarnings(serial)public class Wall extends GameComponentprivate ImageIcon icon;private Image image;public Wall()icon=new ImageIcon(src/images/wall.jpg);i

37、mage=icon.getImage();Override public void paintComponent(Graphics g) / TODO 自动生成的方法存根 tryimage=ImageIO.read(new File(src/images/wall.jpg); g.drawImage(image,0,0,getWidth(),getHeight(),this);catch(Exception e) e.printStackTrace();package posite.gameMap;import java.awt.Graphics;import java.awt.Image;i

38、mport javax.swing.ImageIcon;SuppressWarnings(serial) public class Road extends GameComponent private ImageIcon icon;private Image image;public Road()icon=new ImageIcon(src/images/road.jpg); image=icon.getImage();Overridepublic void paintComponent(Graphics g) / TODO 自动生成的方法存根 g.drawImage(image,0,0,ge

39、tWidth(),getHeight(),this);package posite.gameMap;import java.awt.Color;import java.awt.Container;import java.awt.GridLayout;import javax.swing.JFrame;/测试程序SuppressWarnings(serial)public class Test extends JFrame private GridLayout layout;private int map=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,2,0,0,0

40、,0,0,2,0,0,3,1,1,3,0,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,0,3,0,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,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

41、,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 container=getContentPane();layout=new GridLayout(15,15);container.setLayout(layout);/设置 15 行 *15 列的网格布局Color c=new Color(60,90,0); container.setBackground(

42、c);/ 设置窗口背景颜色for(int i=0;ilayout.getRows();i+)for(int j=0;jlayout.getColumns();j+) switch(mapij) case 0:container.add(new Road();break; case 1:container.add(new Wall();break; case 2:container.add(new House();break; case 3:container.add(new Grass();break; case 4:container.add(new Tree();break;setSize

43、(600,600); setVisible(true);/* param args*/public static void main(String args) / TODO 自动生成的方法存根Test t=new Test(); t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);3.测试结果图SuMi-函脚們冊刪I訓刚|嘲卅删制側曲刪l;F刚渤即0 一IB II! !S!:Model+setData(index:int,value:int):void+getData():int+addObserver(o:View):voi d+removeOb

44、server(o:View) :void+notifyObservers():voidView+addView(v:View)void+removeView(v:View) void +update(data:int):voidDataModel -data:int -observers: List +DataModel() +setData(index:int,value:i nt):void +getData():int +addObserver(o:View):v oid +removeObserver(o:Vie w):void +notifyObservers():voidTable

45、ViewPieViewHistogramView-data:int-startX:int=20-startY:int=20-data:int-data:int-WIDTH:int=30+addView(v:View) void+removeView(v:Vi ew)void +update(data:int): void +paintComponent( g:Graphics):void+addView(v:View) void+removeView(v:Vi ew)void +update(data:int): void +paintComponent( g:Graphics):void+a

46、ddView(v:View )void +removeView(v:V iew)void +update(data:int) :void +paintComponent( g:Graphics):voidFrameView -data:int -views: List +FrameView() +addView(v:View) void +removeView(v:Vi ew)void +update(data:int): voidFrameController -FPS_MIN:int=0 -FPS_MAX:int=100 -FPS_INIT:int=50 -sliders:JSlider

47、-model:Model +FrameController(m: Model)2.源代码 package course.MVC; public interface Model public void setData(int index, int value); public int getData();public void addObserver(View o);public void removeObserver(View o); public void notifyObservers();for(int i=0;idata.length;i+) datai=5;Overridepubli

48、c void setData(int index, int value) / TODO 自动生成的方法存根 this.dataindex=value; notifyObservers();Overridepublic void addObserver(View o) / TODO 自动生成的方法存根if (o = null)throw new NullPointerException();if (!observers.contains(o)observers.add(o);Overridepublic void removeObserver(View o) / TODO 自动生成的方法存根 i

49、f(observers.contains(o) observers.remove(o);Overridepublic void notifyObservers() / TODO 自动生成的方法存根for(Iterator it=observers.iterator();it.hasNext();) View observer=it.next(); observer.update(this.data);Overridepublic int getData() / TODO 自动生成的方法存根 return data;package course.MVC; public interface Vie

50、w public abstract void addView(View v);/添加视图public abstract void removeView(View v);/删除视图public abstract void update(int data); / 更新视图、package course.MVC;import java.awt.Color;import java.awt.Graphics;import javax.swing.JPanel;/表格图SuppressWarnings(serial)public class TableView extends JPanel impleme

51、nts View private int data=60,50,90,90,40,30,10,20,70;private static final int startX=20;private static final int startY=20;public void paintComponent(Graphics g) super.paintComponent(g); for(int i=0;i3;i+) for(int j=0;j3;j+) g.setColor(Color.black); g.drawRect(startX+50*j,startY+50*i,50,50); g.drawString( +datai*3+j, 45+50*j, 45+50*i);Overridepublic void addView(View v) / TODO 自动生成的方法存根System.out.println( 不允许添加视图! );Overridepublic void removeView(Vi

温馨提示

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

评论

0/150

提交评论