结构型设计模式(二)桥接模式

一、一句话背景

假如我有一个画图工具,这个画图工具可以画各种图形,各种图形又可以扩展各种颜色,那么对于这个场景,形状和颜色都是可拓展的,结合起来时,使用一个桥接器,实现各自管理各自维度的拓展就比较合理了。

PS:若直接从图形类型、颜色去扩展Shape类,耦合度会很高,这里的桥接器承担了图形颜色的拓展,此时Shape类(抽象部分)不再关心它自己要怎么实现,反正实现就根据传入的DrawAPI对象(实现部分)去愉快的玩耍就好了,这就实现了解耦。

二、使用场景

对于两个独立变化的维度,使用桥接模式再适合不过了。

如:一个业务多维度扩展时可考虑桥接模式进行解决。

三、模型分析

桥接器:用于减少耦合

图形类(Shape类) :优化前:需要对图形类别(第一层维度)、颜色(第二层维度)都进行拓展,那图形类就会

               有非常多的个性化实例。

        优化后:设置了一个入参为DrawAPI对象的构造方法,应用于多维度的图形拓展场景。引入了

            桥接器以后,只对图形类别(第一层维度)进行拓展,颜色(第二层维度)的拓展由

            桥接器负责,实现解耦。

个性化图形:Shape类的个性化拓展,只进行图形类别(第一层维度)的拓展

个性化颜色:桥接器的个性化拓展,用于分担更细化的维度,颜色(第二层维度)的拓展

四、代码分析

桥接器

/**
 * 桥接接口,定义了各种画图形的方法,实现此接口即是对颜色的拓展
 */
public interface DrawAPI {
    //画个圆
    void drawCircle(int radius, int x, int y);

    //画个正方形
    void drawSquare(int x, int y);
}

图形类 (Shape类)

/**
 * 图形类
 */
public abstract class Shape {
    protected DrawAPI drawAPI;

    //构造方法,传入一个扩展后的个性化图形对象
    protected Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    //图形类的画画方法
    public abstract void draw();
}

个性化图形

/**
 * 圆形类
 */
public class Circle extends Shape {
    private int x, y, radius;

    //圆形类构造方法
    public Circle(int x, int y, int radius, DrawAPI drawAPI) {
        super(drawAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    //圆形类的画画方法
    public void draw() {
        drawAPI.drawCircle(radius, x, y);
    }
}
/**
 * 正方形类
 */
public class Square extends Shape {
    private int x, y;

    //正方形类构造方法
    public Square(int x, int y, DrawAPI drawAPI) {
        super(drawAPI);
        this.x = x;
        this.y = y;
    }

    //正方形类的画画方法
    public void draw() {
        drawAPI.drawSquare(x, y);
    }
}

个性化颜色

/**
 * 原谅色圆形
 */
public class GreenCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("画一个原谅色圆形~");
    }

    @Override
    public void drawSquare(int x, int y) {
        //画不出来!我是正经的原谅色圆形!
    }
}
/**
 * 原谅色正方形
 */
public class GreenSquare implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        //画不出来!我是正经的原谅色正方形!
    }

    @Override
    public void drawSquare(int x, int y) {
        System.out.println("画一个原谅色正方形~");
    }
}
/**
 * 红色圆形
 */
public class RedCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("画一个红色圆形~");
    }

    @Override
    public void drawSquare(int x, int y) {
        //画不出来!我是正经的红色圆形!
    }
}

模拟调用画图

/**
 * 模拟画画
 */
public class BridgePatternDemo {
    public static void main(String[] args) {
        Shape redCircle = new Circle(100, 100, 10, new RedCircle());
        Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());
        Shape greenSquare = new Square(100, 100, new GreenSquare());

        redCircle.draw();
        greenCircle.draw();
        greenSquare.draw();
    }
}

 

原文地址:https://www.cnblogs.com/riches/p/11234535.html