桥接模式类图与代码

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

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

桥接模式将抽象与其实现解耦,使它们都可以独立地变化。也就是说:将一组实现与另一组使用它们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。

【Java代码】

复制代码
public abstract class Drawing {
 
	public abstract void drawLine(double xl,double yl,double x2,double y2);
 
	public abstract void drawCircle(double x,double y,double r);
}
 
public class DP1 {

	public static void draw_a_line(double xl,double yl,double x2,double y2){
        /*代码省略 */
    }
 
    public static void draw_a_circle(double x,double y,double r){
        /*代码省略 */
    }
}
 
public class DP2 {
 
	public static void drawLine(double xl,double x2,double yl,double y2) {
        /*代码省略 */
	}
 
	public static void drawCircle(double x,double y,double r) {
        /*代码省略 */
	}
}
 
public class V1Drawing extends Drawing {

	public void drawLine(double xl,double yl,double x2,double y2) {
		DP1.draw_a_line();
	}

	public void drawCircle(double x,double y,double r) {
		DP1.draw_a_circle(x,y,z);
	}
}
 
public class V2Drawing extends Drawing {
 
	public void drawLine(double xl,double yl,double x2,double y2){
 
        DP2.drawLine();
    }
 
    public void drawCircle(double x,double y,double r){
 
        DP2.drawCircle(x,y,z);
    }
}
 
public abstract class Shape {
 
	protected Drawing _dp;
 
	public abstract void draw();
 
	Shape(Drawing dp) {
 
		_dp = dp;
	}
 
    public void drawLine(double xl,double yl,double x2,double y2) {
        dp.drawLine(xl,y1,x2,y2);
    }

    public void drawcircle (double x,double y,double r) { 
        dp.drawcircle (x,y,r);
    }
}
 
public class Rectangle extends Shape {
 
    private double _xl,_x2,_yl,_y2;

    public Rectangle(Drawing dp,double xl,double yl,double x2,double y2){
        /*代码省略 */
    }

    public void draw(){
        /*代码省略 */
    }
}
 
public class Circle extends Shape {
 
    private double _x,_y,_r;

    public Circle(Drawing dp,double x,double y,double r){
        /*代码省略去 */
    }

    public void draw() {
        drawcircle(_x,_y,_r);
    }
}
相关推荐
JH30737 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱8 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878388 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
DuHz8 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
invicinble8 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
Polaris北极星少女8 小时前
TRSV优化2
算法
较真的菜鸟8 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言