软考软件设计师下午真题-面向对象的程序设计与实现-桥接设计模式(2013年下半年试题六))代码讲解

  • 说明
  • Java代码
  • 注释


说明

欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。

软考java后端工程师 软考程序员java_设计模式

该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,其类图如下图所示。

软考java后端工程师 软考程序员java_ci_02

Java代码

//Shape使用接口Drawing来调用V1Drawing和V2Drawing定义的算法
interface Drawing {	//定义算法的公共接口Drawing
	public void drawLine(double x1, double y1, double x2, double y2);
	public void drawCircle(double x, double y, double r);
}

class DP1 {
	static public void draw_a_line(double x1, double y1, double x2, double y2)	//定义静态方法draw_a_line
	{ /* 代码省略 */ }
	static public void draw_a_circle(double x, double y, double r)	//定义静态方法draw_a_circle
	{ /* 代码省略 */ }
}

class DP2 { 
	static public void drawline(double x1, double y1, double x2 ,double y2)	//定义静态方法drawline
	{ /* 代码省略 */ }
	static public void drawcircle(double x, double y, double r)	//定义静态方法drawcircle
	{ /* 代码省略 */ }
}

class V1Drawing implements Drawing {
	public void drawLine(double x1, double y1, double x2 ,double y2){ 
	/* 代码省略 */ 
	}
	public void drawCircle(double x, double y, double r) { 
		DP1.draw_a_circle(x,y,r);	//调用DP1的静态方法draw_a_circle
	}
}

class V2Drawing implements Drawing {
	public void drawLine(double x1, double y1, double x2 ,double y2){ 
	/* 代码省略 */ 
	}
	public void drawCircle(double x, double y, double r) { 
		DP2.drawcircle(x,y,r);	//调用DP2的静态方法drawcircle
	}
}

//将Shape与Drawing联系起来
abstract class Shape {	//定义抽象类Shape,用于定义和维护对Drawing对象的引用
	private Drawing _dp;	//定义图形特征变量_dp
	abstract public void draw();
	Shape(Drawing dp) { 
		_dp = dp; 
	}
	public void drawLine(double x1, double y1, double x2 ,double y2){ 
		_dp.drawLine(x1, y1, x2, y2);	//通过Shape的变量_dp来调用Drawing所提供的公共接口drawLine
	}							
	public void drawCircle (double x, double y, double r){ 
		_dp.drawCircle(x, y, r);	//通过Shape的变量_dp来调用Drawing所提供的公共接口drawCircle
	}	
}

class Rectangle extends Shape {	//定义子类Rectangle,特征是矩形
	private double _x1, _x2, _y1, _y2;
	public Rectangle(Drawing dp, double x1, double y1, double x2, double y2) {	//定义公有属性的同名构造方法Rectangle
	/* 代码省略 */ 
	}
	public void draw() { 
	/* 代码省略 */ 
	}
}

class Circle extends Shape {	//定义子类Circle,特征是圆形
	private double _x, _y, _r;
	public Circle(Drawing dp, double x, double y, double r) {	//定义公有属性的同名构造方法Circle
	/* 代码省略 */ 
	}
	public void draw() { 
		drawCircle(_x, _y, _r); 
	}
}

注释

几点需要记住的:

  1. Image对应Abstraction;
  2. BMP、GIF、JPEG对应RefinedAbstraction;
  3. ImageImp对应Implementor;
  4. WinImp、LinuxImp对应ConcreteImplementor;
  5. 抽象类不一定有抽象方法,有抽象方法的一定是抽象类;
  6. 抽象类需要子类去继承,即extends;
  7. 接口需要子类去实现,即implements,实现接口就要实现接口中的所有方法;
  8. 接口里的方法都是抽象方法,abstract可省略,抽象方法无方法体;
  9. 调用抽象方法:对象名.方法名;
  10. 调用静态方法:类名.方法名;
  11. 实例化:父类 对象名= new 子类名();
  12. protected表示受保护的,只有本类或子类或父类中可以访问;
  13. 枚举类自动添加public、static、final修饰;
  14. this:当方法的参数名与类的成员变量同名时,可以借助this指针来进行区别;
  15. 类的成员变量的类型和方法的参数的类型应该保持相同;