软考软件设计师下午真题-面向对象的程序设计与实现-桥接设计模式(2013年下半年试题六))代码讲解
- 说明
- Java代码
- 注释
说明
欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。
该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,其类图如下图所示。
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);
}
}
注释
几点需要记住的:
- Image对应Abstraction;
- BMP、GIF、JPEG对应RefinedAbstraction;
- ImageImp对应Implementor;
- WinImp、LinuxImp对应ConcreteImplementor;
- 抽象类不一定有抽象方法,有抽象方法的一定是抽象类;
- 抽象类需要子类去继承,即extends;
- 接口需要子类去实现,即implements,实现接口就要实现接口中的所有方法;
- 接口里的方法都是抽象方法,abstract可省略,抽象方法无方法体;
- 调用抽象方法:对象名.方法名;
- 调用静态方法:类名.方法名;
- 实例化:父类 对象名= new 子类名();
- protected表示受保护的,只有本类或子类或父类中可以访问;
- 枚举类自动添加public、static、final修饰;
- this:当方法的参数名与类的成员变量同名时,可以借助this指针来进行区别;
- 类的成员变量的类型和方法的参数的类型应该保持相同;