0%

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

1. 桥接模式概述

  • 概念

    • 将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。桥接模式主要用于两个或多个同等级的接口
    • 如果一个对象有两种或者多种分类方式,并且两种分类方式都容易变化,此时使用继承很容易造成子类越来越多,所以更好的做法是把这种分类方式分离出来,让它们独立变化,使用时将不同的分类进行组合即可
  • 特点

    • 合成/聚合复用原则:优先使用合成/聚合,而不是类继承
    • 继承虽然是面向对象的三大特性之一,但继承会导致子类与父类有非常紧密的依赖关系,它会限制子类的灵活性和子类的复用性。而使用合成/聚合,也就是使用接口实现的方式,就不存在依赖问题,一个类可以实现多个接口,可以很方便地拓展功能
  • Demo

    • 接口类 Color,仅包含一个获取颜色的方法

      1
      2
      3
      public interface IColor {
      String getColor();
      }
    • 每种颜色都实现此接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      public class Red implements IColor {
      @Override
      public String getColor() {
      return "红";
      }
      }


      public class Blue implements IColor {
      @Override
      public String getColor() {
      return "蓝";
      }
      }


      public class Yellow implements IColor {
      @Override
      public String getColor() {
      return "黄";
      }
      }


      public class Green implements IColor {
      @Override
      public String getColor() {
      return "绿";
      }
      }
    • 在每个形状类中,桥接 IColor 接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      	class Rectangle implements IShape {

      private IColor color;

      void setColor(IColor color) {
      this.color = color;
      }

      @Override
      public void draw() {
      System.out.println("绘制" + color.getColor() + "矩形");
      }
      }


      class Round implements IShape {

      private IColor color;

      void setColor(IColor color) {
      this.color = color;
      }

      @Override
      public void draw() {
      System.out.println("绘制" + color.getColor() + "圆形");
      }
      }


      class Triangle implements IShape {

      private IColor color;

      void setColor(IColor color) {
      this.color = color;
      }

      @Override
      public void draw() {
      System.out.println("绘制" + color.getColor() + "三角形");
      }
      }
    • 测试函数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      @Test
      public void drawTest() {
      Rectangle rectangle = new Rectangle();
      rectangle.setColor(new Red());
      rectangle.draw();

      Round round = new Round();
      round.setColor(new Blue());
      round.draw();

      Triangle triangle = new Triangle();
      triangle.setColor(new Yellow());
      triangle.draw();
      }
      • 抽象部分指的是父类,对应本例中的形状类,实现部分指的是不同子类的区别之处
      • 将子类的区别之处,即本例中的颜色,分离成接口,通过组合的方式桥接颜色和形状,这就是桥接模式
-------------------- 本文结束感谢您的阅读 --------------------