JAVA Bridge桥接模式

2022-08-01,,,

桥接模式

一个复杂类中可能包括了多个维度的属性行为,桥接模式在逻辑上可以将这些维度进行分离,分离为抽象部分(接口)和实现(抽象类)部分。1.通过分离抽象部分和实现部分可使原本复杂的类各部分间解耦合,且更符合“单一职责原则”。2.抽象部分和实现部分这两个部分,可以独立地变化、独立扩展,通过自由组合产生新的类。这种通过(聚合和关联关系)产生类的方式较传统通过继承产生新类的方式,扩展性更好,减少了系统中类,防止类爆炸问题。

构建过程

  1. 确定要设计的复杂类的维度。由抽象部分(Interface)和实现部分(Abstract)组成。
  2. 抽象部分Interface。通过关联关系 关联实现部分。(由于抽象部分和实现部分最后要通过组合形成一个整体,因此两部分间要发生关系,可通过参数将实现部分的引用传入Interface方法,以实现抽象部分的行为方法作用于实现部分的对象)
  3. 实现部分Abstract。内部聚合了抽象部分的引用,通过聚合持有Interface的引用对象。
  4. 具体实现类分别实现Abstract和Interface。
  5. 具体实现类相互组合。实现全新的对象

DEMO

一个复杂类”各种颜色的形状“,通过桥接模式进行实现。(对应上面的构建过程进行解释)。

  1. 复杂类”各种颜色的形状“进行维度分离,分立为实现部分 Abstract Shape和抽象部分Interface Color。
  2. 抽象部分Interface Color的接口方法bepaint中持有shape的对象引用,以保证interface的行为可作用于shape。
  3. 实现部分 Abstract Shape。内部聚合封装了抽象部分Color的引用,持有了抽象部分Interface Color的引用对象(拥有了Color的行为)。
  4. 具体实现类分别继承、实现了Shape和Color。包括各种形状类,各种颜色类。
  5. 通过组合各种形状类,各种颜色类,获得构建的复杂新对象。(Shape类的Circle具体类中的Draw方法可通过持有Color对象引用调用其bepaint方法,实现复合类的行为。)

类图:搬一张别人的类图,自己懒得画了

主方法:

//DEMO桥接模式
//Color和抽象类shape 在两个维度上相互组合。
//Color类,在接口中传入Shape对象,修改Shape的对象
//Shape类,聚合了一个Color对象
public class Bridge_v1 {

    public static void main(String[] args) {
        Color black = new Black();
        Color gray = new Gray();
        Color white = new White();

        Shape circle = new Circle();
        Shape rectangle = new Rectangle();
        Shape square = new Square();

        circle.SetColor(black);
        rectangle.SetColor(gray);
        square.SetColor(white);

        circle.Draw();
        rectangle.Draw();
        square.Draw();
    }
}

所谓的“抽象部分”,Color接口:

//维度:Color
//接口类,通过形参数和Shape关联

interface Color {

    void PaintShape(Shape shape);
    void PaintColor();
}

所谓的“实现部分”,Shape抽象类:

//维度:Shape
//抽象类,聚合了Color接口
abstract class Shape {
    Color color;
    public abstract void SetColor(Color color);
    public abstract void Draw();
}

Color具体实现类:

public class Black implements Color{

    @Override
    public void PaintShape(Shape shape) {
        System.out.println(shape);
    }

    @Override
    public void PaintColor()
    {
        System.out.print("Black ");
    }
}
public class Gray implements Color{

    @Override
    public void PaintShape(Shape shape) {
        System.out.println(shape);
    }

    @Override
    public void PaintColor()
    {
        System.out.print("Gray ");
    }
}
public class White implements Color{

    @Override
    public void PaintShape(Shape shape) {
        System.out.println(shape);
    }

    @Override
    public void PaintColor()
    {
        System.out.print("White ");
    }
}

Shape具体实现类:

public class Circle extends Shape{

    @Override
    public void SetColor(Color color) {
        this.color = color;
    }

    @Override
    public void Draw() {
        this.color.PaintColor();
        this.color.PaintShape(this);
    }

    @Override
    public String toString() {
        return "Circle";
    }
}
public class Rectangle extends Shape{

    @Override
    public void SetColor(Color color) {
        this.color = color;
    }

    @Override
    public void Draw() {
        this.color.PaintColor();
        this.color.PaintShape(this);
    }

    @Override
    public String toString() {
        return "Rectangle";
    }
}
public class Square extends Shape{

    @Override
    public void SetColor(Color color) {
        this.color = color;
    }

    @Override
    public void Draw() {
        this.color.PaintColor();
        this.color.PaintShape(this);
    }

    @Override
    public String toString() {
        return "Square";
    }
}

使用场景

  1. 多维度的复杂类的重构。复杂类分解为多个单独维度的抽象,使得每个维度职责单一,解耦合,扩展性好。再通过组合实现原复杂类的逻辑。
  2. 要设计的类包含多维度属性。可使用桥接模式先进行维度分离,再进行组合。
  3. 通过继承扩展而产生大量类的场景,使用桥接可减少类数量,防止类爆炸。

优点

  1. 抽象和实现的分离。
  2. 优秀的扩展能力。
  3. 实现细节对客户透明。

本文地址:https://blog.csdn.net/qq_29047189/article/details/107486804

《JAVA Bridge桥接模式.doc》

下载本文的Word格式文档,以方便收藏与打印。