桥接模式类图与代码

欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表 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);
    }
}
相关推荐
Дерек的学习记录2 小时前
C++:入门基础(下)
开发语言·数据结构·c++·学习·算法·visualstudio
hzc09876543212 小时前
Spring Integration + MQTT
java·后端·spring
yugi9878382 小时前
无线传感器网络中GAF算法节点特性分析
网络·算法
1027lonikitave3 小时前
使用斐波那契数列讲解尾递归
算法
前路不黑暗@3 小时前
Java项目:Java脚手架项目的公共模块的实现(二)
java·开发语言·spring boot·学习·spring cloud·maven·idea
人道领域3 小时前
Spring核心注解全解析
java·开发语言·spring boot
金牌归来发现妻女流落街头4 小时前
日志级别是摆设吗?
java·spring boot·日志
滴滴答滴答答4 小时前
LeetCode Hot100 之 16 合并两个有序链表
算法·leetcode·链表
MOONICK4 小时前
C#基础入门
java·开发语言
ASKED_20194 小时前
企业级大模型微调(Fine-tuning)策略
大数据·人工智能·算法