课时93:案例分析二(绘图处理)
摘要:
1.基本原理
2.绘制实例
01. 绘制的基本原理
设计一个绘图系统,使其能够根据不同的图形类型进行绘制。这实际上是一个设计过程,理解这个过程至关重要。
考虑一个现实场景:绘图。一个典型的绘图程序通常包含以下几个关键部分:
1. 客户端(Client):客户端主要关注图形的绘制标准,它并不需要了解具体的图形实现细节。
2. 绘图标准(Drawing Standard/Interface):这是一个抽象层,定义了绘图的基本行为。例如, Drawable 接口可以定义一个 draw() 方法。
3.具体图形(Concrete Shapes):客户端可以通过绘图标准创建各种图形,如圆形、三角形和矩形。这些图形都实现了绘图标准。
这样的程序通常可以分解为几个主要部分。
首先,需要定义一个标准,或者说接口。客户端无需关心具体的实现细节,它主要关注的是图形绘制的标准。这个标准定义了绘图的基本行为,例如,如何绘制一个图形。基于这个绘图标准,可以创建各种具体的图形类,比如圆形、三角形和矩形等。
每种图形都遵循绘图标准,实现自己的绘制方式。例如,使用某个绘图软件,你会发现各种图形工具的功能基本相同,只是操作的形式和绘制的形状不同。
然而,从另一个角度来看,客户端代码实际上并不需要知道要绘制的是什么具体的形状。客户端更关心的是如何获取绘图对象,并使用绘图工具类来实现图形的绘制。至于有多少种图形类型,客户端并不需要关心。图形绘制类负责将图形输出到不同的媒介,例如文本文件。
整个代码的设计流程强调的是一种抽象,即客户端不需要了解具体的绘制实现。客户端只需要按照标准获取绘图对象,并调用相应的绘制方法。
在这种设计模式下,可以引入一个工厂类(Factory)来负责创建具体的图形对象。客户端与工厂交互,工厂再与具体的图形子类关联。同时,工厂也需要与绘图标准接口关联。
这种设计方式能够清晰地描述出程序的基本结构。这种设计思想就是所谓的标准定义与实现分离。如果需要定义绘图标准,应该采用这种结构。
02. 绘制实操
interface IGraphical { //定义绘图标准 public void paint(); } class Point{ //坐标的点,点有 x , y 两个数值 private double x; private double y; public Point(double x,double y){ this.x=x; this.y=y; } public double getY { return this.y; } public double getX { return this.x; } } class Triangle<p> implements IGraphical {//绘制三角形 private Point[] x;// 保存第一条边的坐标 private Point[] y;//保存第二条边的坐标 private Point[] z;// 保存第三条边的坐标,坐标必须提供且长度正确 public Triangle ( double[] x, double[] y, double[] z) { this.x = x; this.y = y; this.z = z; } public void paint(){ // 打印绘制第一条边的开始坐标和结束坐标 public void paint(){ // 打印绘制第一条边的开始坐标和结束坐标 System.out.println("绘制第一条边,开始坐标:["+this.x[0].getX()+","+this.y[0].getY()+"],结束坐标:["+this.x[1].getX()+","+this.y[1].getY()+"]"); //打印绘制第二条边的开始坐标和结束坐标 System.out.println("绘制第一条边,开始坐标:["+this.y[0].getX()+","+this.z[0].getY()+"],结束坐标:["+this.y[1].getX()+","+this.z[1].getY()+"]"); //打印绘制第三条边的开始坐标和结束坐标 System.out.println("绘制第一条边,开始坐标:["+this.x[0].getX()+","+this.z[0].getY()+"],结束坐标:["+this.x[1].getX()+","+this.z[1].getY()+"]"); } } // 定义一个名为圆形的类 class Circular implements IGraphical{ class Circular implements IGraphical { private double radius; //设置半径 public Circular(double radius) { this.radius = radius; } public void paint() { //设置绘图,以半径进行绘制 System.out.println("以半径为" + this.radius + "绘制圆形。"); } } } } class Factory { public static IGraphical getInstance(String className, double... args) { if(" triangle".equalsIgnoreCase(className)) { //给三角形实例 return new Triang1e( new Point[]{ new Point(args [ 0 ] ,args [ 1 ] ), new Point(args [ 2 ] ,args[3]} //进行封装,第一组,x ,y 的坐标 new Point[]{ new Point(args [ 4 ] ,args [ 5 ] ), new Point(args [ 6 ] ,args[7]} //第二组的坐标,y ,z 的坐标 new Point[]{ new Point(args [ 8 ] ,args [ 9 ] ), new Point(args [ 10 ] ,args[11]} );//第三组的坐标,x, z 的坐标 } else if ("circle".equalsIgnoreCase(className)) //给圆形,只用给半径 return new Circu1ar (args [ 0 ] ) }else{ return null; } } } public class JavaDemo { public static void main (String args [ ]) { IGraphical iga =Factory.getInstance(("triangle",1.1,2.2,3.3,11.11,22.22,33.33,111.111,222.222,333.333)); iga.paint(); //绘制三角 }
输入 javac JavaDemo.java
进行编译
输入 java JavaDemo
执行运行结构如下:
进行圆形的绘制:
public class JavaDemo { public static void main (String args [ ]) { IGraphical iga =Factory.getInstance(("triangle",1.1,2.2,3.3,11.11,22.22,33.33,111.111,222.222,333.333)); iga.paint(); //绘制三角 Graphical igb=Factory.getInstance(("circular",88.11)); igb.paint(); //绘制圆形
再次编译执行,结果如下:
注:
三角形需要三边, x ,y , z
这样就描述了一个基本的绘图系统结构。需要注意的是,这里的代码仅仅是示例,用于演示设计思想,并没有实现真正的绘图功能。这个例子主要目的是为了展示设计模式的应用。