您好,欢迎访问三七文档
设计模式课程设计题目:画图程序学院:信息科学与技术学院专业:软件工程学号:20092384姓名:陈志1.需求分析该系统是一个画图程序,我们要用设计模式的思想来设计系统结构,然后实现基本图形的绘制功能。1.1设计模式要求至少在其中运用6种模式,其中涉及到的模式有装饰模式、策略模式、桥梁模式三种。1.2画图基本要求能实现基本图形的绘制功能1.3画图高级要求实现图形的操作(如选取、移动、放大、缩小、改变颜色、改变线形等)和持久化(利用文件或利用数据库)。2.系统设计首先,画图程序可以实现绘制圆形、矩形和按钮,这里可以将圆形、矩形和按钮看作三个不同的类,那么我们可以采用抽象工厂的方式来创建它们。对于画组合图,我们可以采用组合模式将二者结合起来。而对于图形颜色或者粗细的改变,我们可以使用外观模式。然后,我们可以使用原型模式来实现对于最后一个图形的复制。在系统中可以使用代理模式来实现显示图片。下面是对需要用到的设计模式进行的分析。2.1使用设计模式2.1.1桥梁模式桥梁模式,结构型模式一种.设计程序过程中,会经常使用到抽象类或者接口来完成抽象的过程。继承或实现的类通过不同的实现方式来完成抽象类或接口的变化,也就是实现过程的变化,但可能会有这样的情况,抽象过程同样需要进行变化,也就是抽象类或者接口需要变化,这样就会造成原有的继承或实现关系复杂,关系混乱.桥梁模式利用将抽象层和实现层进行解耦,使两者不再像继承或实现这样的较强的关系,从而使抽象和实现层更加独立的完成变化的过程.使系统更加清晰。桥梁模式主要由抽象类、修正抽象类、实现类以及具体实现类组成.抽象类,制定接口,同时给出一个实现化的引用。修正抽象类,扩展抽象类,修正或改变抽象类中指定的接口。实现类,提供实现化角色的接口,但不进行具体实现过程,该接口不一定给出与抽象类相同的接口,只是提供实现的方式。具体实现类,完成实现类中定义的实现接口的具体实现过程。具体代码如下:packageBridgePattern;importjava.awt.Color;importjava.awt.Graphics;importjava.util.Random;importcn.ming.Main.circle;publicclassCpicextendsPic{publicCpic(Graphicsg){super(g);}publicvoiddrawpic(Graphicsg){g.setColor(Color.RED);circlec1=newcircle();Randomran2=newRandom();inta=ran2.nextInt(150)+10;intb=ran2.nextInt(350)+200;intc=ran2.nextInt(280)+140;c1.settings(a,b,c);g.fillOval(b-a/2,c-a/2,a,a);g.setColor(Color.BLUE);g.fillOval(50+b-a/2,c-a/2-50,a,a);g.setColor(Color.GREEN);g.fillOval(100+b-a/2,c-a/2,a,a);}}packageBridgePattern;importjava.awt.Graphics;publicabstractclassPic{publicGraphicsg;Pic(Graphicsg){this.g=g;}publicabstractvoiddrawpic(Graphicsg);}packageBridgePattern;importjava.awt.Color;importjava.awt.Graphics;importjava.util.Random;importcn.ming.Main.circle;publicclassRpicextendsPic{publicRpic(Graphicsg){super(g);}publicvoiddrawpic(Graphicsg){g.setColor(Color.RED);circlec2=newcircle();Randomran2=newRandom();inta=ran2.nextInt(150)+10;intb=ran2.nextInt(350)+100;intc=ran2.nextInt(150)+100;c2.settings(a,b,c);g.fillOval(b-a/2,c-a/2,a,a);g.setColor(Color.BLUE);g.fillOval(b-3*a/8,c-3*a/8,3*a/4,3*a/4);g.setColor(Color.WHITE);g.fillOval(b-a/4,c-a/4,a/2,a/2);g.setColor(Color.GREEN);g.fillOval(b-a/8,c-a/8,a/4,a/4);}}运行结果:2.1.2装饰模式JAVA23种设计模式之一,英文叫DecoratorPattern,又叫装饰者模式。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式的特点;(1)装饰对象和真实对象有相同的接口。这样客户端对象就可以和真实对象相同的方式和装饰对象交互。(2)装饰对象包含一个真实对象的引用(reference)(3)装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。具体代码如下:packageDecoratorPattern;importjava.awt.Graphics;importcn.ming.Main.triangles;publicclassDecoTrextendstriangles{publictrianglest;privateGraphicsg;publicDecoTr(){t=newtriangles();}publicstaticvoidfilltr(Graphicsg,trianglest){if(t!=null)t.filltr(g,t);}}packageDecoratorPattern;importjava.awt.Color;importjava.awt.Graphics;importcn.ming.Main.Triangle;publicclassDecoTr1extendsDecoTr{publicstaticvoidfilltr(Graphicsg,Trianglet){g.setColor(Color.GREEN);g.fillOval(t.x-25,t.y-25,50,50);}}packageDecoratorPattern;importjava.awt.Color;importjava.awt.Graphics;importcn.ming.Main.Triangle;publicclassDecoTr2extendsDecoTr{publicstaticvoidfilltr(Graphicsg,Trianglet){g.setColor(Color.RED);g.fillOval(t.x+t.w-25,t.y-25,50,50);}}运行结果:2.1.3策略模式策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。具体代码实现如下:packageStrategyPattern;importjava.awt.Graphics;importjava.awt.Point;publicclasspolicy{strategys;publicpolicy(strategys){this.s=s;}publicvoidchoosepolicy(Graphicsg,Pointp1,Pointp2,Pointp3){s.drawing(g,p1,p2,p3);}}packageStrategyPattern;importjava.awt.Graphics;importjava.awt.Point;publicabstractclassstrategy{publicabstractvoiddrawing(Graphicsg,Pointp1,Pointp2,Pointp3);}packageStrategyPattern;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Point;publicclassstrategyAextendsstrategy{publicPointp1,p2,p3;publicdoublearea,p;publicdoubledistenceOfPoints(Pointp1,Pointp2){returnMath.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}publicPointgetCircumcenter(Pointp1,Pointp2,Pointp3){doubledis12=distenceOfPoints(p1,p2);doubledis23=distenceOfPoints(p2,p3);doubledis31=distenceOfPoints(p3,p1);p=dis12+dis23+dis31;doublepp=p/2;area=Math.sqrt(pp*(pp-dis12)*(pp-dis23)*(pp-dis31));doublex=(p1.x*dis23+p2.x*dis31+p3.x*dis12)/p;doubley=(p1.y*dis23+p2.y*dis31+p3.y*dis12)/p;returnnewPoint((int)x,(int)y);}publicvoiddrawing(Graphicsg,Pointp1,Pointp2,Pointp3){//Pointsp1,Pointsp2,Pointsp3g.drawLine(p1.x,p1.y,p2.x,p2.y);g.drawLine(p2.x,p2.y,p3.x,p3.y);g.drawLine(p3.x,p3.y,p1.x,p1.y);Pointcenter=getCircumcenter(p1,p2,p3);doubleradius=(2*area)/p;intx=(int)(center.x-radius);inty=(int)(center.y-radius);intwidth=(int)(radius*2);g.setColor(Color.BLUE);g.fillOval(x,y,width,width);}}packageStrategyPattern;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Point;publicclassstrategyBextendsstrategy{publicPointp1,p2,p3;publicPointgetCircumcenter(Pointp1,Pointp2,Pointp3){dou
本文标题:设计模式课程设计
链接地址:https://www.777doc.com/doc-5337648 .html