202桥接模式

129 阅读3分钟

定义

桥接模式将抽象和实现解耦,使得两者可以独立地变化。

“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

解释

假如你有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和 方形Square。你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。 但是, 由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合, 例如 蓝色圆形Blue­Circle和 红色方形Red­Square 。

图片1.png

桥接模式 通过将继承改为组合的方式来解决这个问题。 具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。

图片2.png

根据该方法, 我们可以将颜色相关的代码抽取到拥有红色和蓝色两个子类的颜色类中, 然后在形状类中添加一个指向某一颜色对象的引用成员变量。 现在, 形状类可以将所有与颜色相关的工作委派给连入的颜色对象。 这样的引用就成为了 形状和 颜色之间的桥梁。 此后, 新增颜色将不再需要修改形状的类层次, 反之亦然。

类图

图片3.png

  • Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个 Implementor(实现类接口)类型的对象并可以维护该对象,它与 Implementor 之间具有关联关系。
  • RefinedAbstraction(提炼抽象类):扩充由 Abstraction 定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在 Abstraction 中声明的抽象业务方法,在 RefinedAbstraction 中可以调用在 Implementor 中定义的业务方法。
  • Implementor(实现类接口):定义实现类的接口,这个接口不一定要与 Abstraction 的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor 接口仅提供基本操作,而 Abstraction 定义的接口可能会做更多更复杂的操作。Implementor 接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在 Abstraction 中不仅拥有自己的方法,还可以调用到 Implementor 中定义的方法,使用关联关系来替代继承关系。
  • ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现,在程序运行时,ConcreteImplementor 对象将替换其父类对象,提供给抽象类具体的业务操作方法

代码

public class BridgePattern {
    public static void main(String[] args) {
        //创建一个圆形
        Shape shape= new Circle();
        //加蓝色
        shape.setDawAPI(new BuleColorAPI());
        shape.draw();
    }
}
// abstract class
abstract class Shape{
    protected ColorAPI colorAPI;
    public void setDawAPI(ColorAPI colorAPI){  // 注入颜色变量
        this.colorAPI=colorAPI;
    }
    public abstract  void draw();
}
class Circle extends Shape{
    @Override
    public void draw() {
        System.out.println("圆形");
        colorAPI.paint();
    }
}
class Rectangle extends Shape{
    @Override
    public void draw() {
        System.out.println("长方形");
        colorAPI.paint();
    }
}
// interface
interface ColorAPI{
    public void paint();
}
class BuleColorAPI implements ColorAPI{
    @Override
    public void paint() {
        System.out.println("蓝色");
    }
}
class RedColorAPI implements ColorAPI{
    @Override
    public void paint() {
        System.out.println("红色");
    }
}