【地铁上的设计模式】--结构型模式:桥接模式

2023-05-03 11:15:58 浏览数 (1)

什么是桥接模式

桥接模式是一种结构型设计模式,它通过将抽象与实现分离来提高代码的可扩展性。桥接模式的关键是使用抽象类或接口来代表抽象部分,使用具体类来代表实现部分,然后使用组合将两者连接起来。通过这种方式,桥接模式使得抽象部分和实现部分可以独立地扩展,而不会相互影响。 桥接模式的优点包括:可扩展性好,可以独立地扩展抽象部分和实现部分,不会相互影响;可维护性好,抽象部分和实现部分分离,易于维护;可复用性好,可以重用已有的抽象类和实现类。缺点是:增加了系统的复杂性,需要额外的抽象类和接口。 桥接模式常用于GUI编程中,用于将抽象的用户界面部分与底层的实现部分分离。它也常用于驱动程序设计中,用于将设备的抽象接口与具体的设备驱动程序分离。

如何实现桥接模式

桥接模式的实现步骤如下:

  1. 定义抽象类(或接口),作为桥接模式中的“桥”。
  2. 定义实现类,实现抽象类中的方法。
  3. 在实现类中,使用另一个抽象类(或接口)的实例,作为自己的一个成员变量。
  4. 在需要调用另一个抽象类的方法时,通过成员变量调用。

通过这种方式,将实现类与抽象类分离开来,使得它们可以独立地进行变化。同时,使用抽象类的实例作为成员变量,可以在运行时动态地切换实现方式,从而达到灵活性的目的。 需要注意的是,在使用桥接模式时,需要根据实际情况来选择抽象类或接口作为“桥”,并且需要保证桥接类中的方法能够实现需求,否则会导致桥接模式的失效。 Java实现 以下是 Java 实现桥接模式的代码示例:

代码语言:javascript复制
// 创建实现类接口
interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

// 创建实现类的具体实现
class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "   radius   ", x: "   x   ", y: "   y   "]");
   }
}

class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "   radius   ", x: "   x   ", y: "   y   "]");
   }
}

// 创建抽象类,聚合实现类接口
abstract class Shape {
   protected DrawAPI drawAPI;

   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   
   public abstract void draw();    
}

// 创建实现抽象类的具体实现
class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;
      this.y = y;
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

// 使用 Shape 和 DrawAPI 类画出不同颜色的圆
public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

      redCircle.draw();
      greenCircle.draw();
   }
}

以上代码中,DrawAPI 接口定义了 drawCircle 方法,RedCircleGreenCircle 类实现了该接口并提供了具体的实现。Shape 抽象类聚合了 DrawAPI 接口,并定义了 draw 抽象方法。Circle 类继承了 Shape 抽象类,并提供了具体的实现。最后,BridgePatternDemo 类使用不同的实现类和实现方式画出了不同颜色的圆。 C#实现 以下是使用C#实现桥接模式的示例代码:

代码语言:javascript复制
using System;

// 桥接模式中的实现接口
interface IImplementor
{
    void OperationImpl();
}

// 桥接模式中的抽象类
abstract class Abstraction
{
    protected IImplementor implementor;

    public Abstraction(IImplementor implementor)
    {
        this.implementor = implementor;
    }

    public abstract void Operation();
}

// 桥接模式中的具体实现类A
class ConcreteImplementorA : IImplementor
{
    public void OperationImpl()
    {
        Console.WriteLine("ConcreteImplementorA Operation");
    }
}

// 桥接模式中的具体实现类B
class ConcreteImplementorB : IImplementor
{
    public void OperationImpl()
    {
        Console.WriteLine("ConcreteImplementorB Operation");
    }
}

// 桥接模式中的具体实现类C
class ConcreteImplementorC : IImplementor
{
    public void OperationImpl()
    {
        Console.WriteLine("ConcreteImplementorC Operation");
    }
}

// 桥接模式中的扩展抽象类A
class RefinedAbstractionA : Abstraction
{
    public RefinedAbstractionA(IImplementor implementor) : base(implementor)
    {
    }

    public override void Operation()
    {
        Console.Write("RefinedAbstractionA ");
        implementor.OperationImpl();
    }
}

// 桥接模式中的扩展抽象类B
class RefinedAbstractionB : Abstraction
{
    public RefinedAbstractionB(IImplementor implementor) : base(implementor)
    {
    }

    public override void Operation()
    {
        Console.Write("RefinedAbstractionB ");
        implementor.OperationImpl();
    }
}

// 客户端代码
class Client
{
    static void Main(string[] args)
    {
        // 使用ConcreteImplementorA实现
        Abstraction abstraction = new RefinedAbstractionA(new ConcreteImplementorA());
        abstraction.Operation();

        // 使用ConcreteImplementorB实现
        abstraction = new RefinedAbstractionB(new ConcreteImplementorB());
        abstraction.Operation();

        // 使用ConcreteImplementorC实现
        abstraction = new RefinedAbstractionA(new ConcreteImplementorC());
        abstraction.Operation();

        Console.ReadKey();
    }
}

该示例展示了如何使用C#实现桥接模式。其中,IImplementor接口定义了实现类的操作方法,Abstraction抽象类定义了抽象类的操作方法,并包含了对实现类的引用,ConcreteImplementorAConcreteImplementorBConcreteImplementorC分别是三个具体的实现类,RefinedAbstractionARefinedAbstractionB是两个扩展抽象类,通过继承Abstraction来对抽象类进行扩展。最后,Client类是客户端代码,用于创建抽象类的实例,并使用不同的实现类来实现其操作方法。

总结

桥接模式是一种结构型设计模式,将抽象与其实现解耦,使它们可以独立地变化。该模式通过引入一个桥接接口来实现,该接口将抽象类与实现类连接起来,从而使它们可以彼此独立地变化。桥接模式的优点是它提供了更大的灵活性和可扩展性,使得程序更容易维护和扩展。它可以帮助我们在不破坏现有的类结构的情况下,将抽象与实现分离开来,并且可以让我们轻松地切换和添加实现。缺点是它增加了代码的复杂性和理解难度,需要正确地设计桥接接口和实现类之间的关系。

0 人点赞