桥接模式:将类的功能层次和实现层次分离,动态结合

发布时间 2023-04-25 10:37:55作者: 穆海如枫

桥接模式是一种软件设计模式,它可以将抽象部分与它们的实现部分分离开来,以便两者都可以独立地进行变化。该模式使用组合而不是继承来完成这一点。

在桥接模式中,抽象部分和实现部分之间建立了一个桥梁(Bridge)。抽象部分定义出高层次结构,而实现部分定义出低层次结构。通过桥梁,抽象部分和实现部分可以独立地进行扩展,而不会影响到对方。

举个例子,假设你正在设计一个图形用户界面(GUI)工具包,其中包含不同类型的 UI 元素(如按钮、文本框等)。每种 UI 元素都有不同的行为和样式,而这些行为和样式与操作系统、窗口系统和视觉主题等因素相关联。使用桥接模式,你可以将 UI 元素和这些因素分离开来,使得它们可以独立地进行扩展和修改,从而更好地适应不同的环境和需求。

总的来说,桥接模式可以帮助我们实现更加灵活和可扩展的软件系统,并且可以减少类之间的耦合。

// 实现化角色
interface GuiImpl {
  void drawButton();
}

// 具体实现化角色A
class WindowsGui implements GuiImpl {
  public void drawButton() {
    System.out.println("Windows风格的按钮");
  }
}

// 具体实现化角色B
class MacGui implements GuiImpl {
  public void drawButton() {
    System.out.println("Mac风格的按钮");
  }
}

// 抽象化角色
abstract class Button {
  protected GuiImpl impl;
  
  public Button(GuiImpl impl) {
    this.impl = impl;
  }
  
  abstract void draw();
}

// 扩展抽象化角色
class SquareButton extends Button {
  public SquareButton(GuiImpl impl) {
    super(impl);
  }
  
  public void draw() {
    System.out.print("绘制正方形按钮,样式为:");
    impl.drawButton();
  }
}

// 扩展抽象化角色
class CircleButton extends Button {
  public CircleButton(GuiImpl impl) {
    super(impl);
  }
  
  public void draw() {
    System.out.print("绘制圆形按钮,样式为:");
    impl.drawButton();
  }
}

// 客户端代码
public class Client {
  public static void main(String[] args) {
    GuiImpl windows = new WindowsGui();
    GuiImpl mac = new MacGui();

    Button squareButton = new SquareButton(windows);
    Button circleButton = new CircleButton(mac);

    squareButton.draw();
    circleButton.draw();
  }
}