原创

设计模式之桥接模式

温馨提示:
本文最后更新于 2023年11月16日,已超过 433 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

桥接模式

桥接模式又称为柄体模式或接口模式,是用于把抽象化与实现化解耦,使得二者可以独立变化。它属于结构型模式。

适用场景

当一个类内部具备两种以上变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适合以下几种场景:

  • 1.在抽象和具体实现之间需要增加更多的灵活性场景;
  • 2.一个类存在两个以上独立变化的维度,而这些维度都需要进行独立扩展;
  • 3.不希望被继承或因为多层继承导致系统类个数剧增;

桥接模式的一个常用场景就是为了替换继承。我们知道继承可以很好的帮助我们实现代码复用,但同时,这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类是否需要。这说明了继承具有强侵入性,同时会导致子类臃肿。同时,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多。

优缺点

优点

  • 抽象与实现分离,扩展能力强;
  • 符合开闭原则;
  • 符合合成复用原则;
  • 实现细节对客户透明;

缺点

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别系统中两个独立变化的维度,这增加了系统的理解与设计难度。

桥接模式的角色组成

  • 抽象:定义抽象接口,通常包含对实现接口的引用;
  • 扩展抽象:对抽象的扩展,可以是抽象类的子类或具体实现类;
  • 实现:定义实现接口,提供基本操作的接口;
  • 具体实现:实现接口的具体类;

    实现

    实现接口:

    public interface Color {
          void coloring(String shape);
    }
    

    具体实现

    public class Green implements Color{
          @Override
          public void coloring(String shape) {
              System.out.println("绿色的" + shape);
          }
    }
    
    public class Red implements Color{
          @Override
          public void coloring(String shape) {
              System.out.println("红色的" + shape);
          }
    }
    
    public class White implements Color{
          @Override
          public void coloring(String shape) {
              System.out.println("白色的" + shape);
          }
    }
    

    抽象接口

    public abstract class Shape {
          protected Color color;
          public void setColor(Color color){
              this.color = color;
          }
          public abstract void draw();
    }
    

    扩展抽象

    public class Circle extends Shape{
          @Override
          public void draw() {
              color.coloring("圆形");
          }
    }
    
    public class Rectangle extends Shape{
          @Override
          public void draw() {
              System.out.println("长方形");
          }
    }
    
    public class Square extends Shape{
          @Override
          public void draw() {
              color.coloring("正方形");
          }
    }
    

    使用

    public static void main(String[] args) {
          Color white = new White();
          Shape square = new Square();
          square.setColor(white);
          square.draw();
    
          Shape circle = new Circle();
          circle.setColor(white);
          circle.draw();
    }
    

    输出

    白色的正方形
    白色的圆形

正文到此结束
本文目录