设计模式-桥接模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 桥接模式和代理模式的区别
    • 代码示例
      • Java实现桥接模式
      • python实现桥接模式
    • 桥接模式在spring中的应用


模式介绍

桥接模式是一种对象结构型模式,也称为柄体(Handle and Body)模式或接口(interface)模式。它的主要目的是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。这种模式通过组合的方式建立两个类之间的联系,而不是通过继承。桥接模式的核心在于解耦抽象和实现。

在这里插入图片描述

模式特点

桥接模式有以下几个主要特点:

  1. 分离接口和实现部分 :桥接模式通过将抽象部分和实现部分分离,可以独立地对抽象部分和实现部分进行扩展,从而提高系统的灵活性和可维护性。
  2. 提高可扩展性 :桥接模式可以使得抽象部分和实现部分都可以独立地变化,从而提高了系统的可扩展性。
  3. 实现细节对客户的透明:桥接模式可以隐藏实现细节,客户只需要关心抽象部分和实现部分的接口,从而使得系统的实现细节对客户透明。
  4. 增加聚合对象的内部方法 :桥接模式通过将抽象部分和实现部分分离,使得它们可以独立地变化,但同时也增加了聚合对象的内部方法,因为聚合对象需要包含它的类来调用这些方法。

桥接模式通过将抽象部分和实现部分分离,提高了系统的灵活性和可维护性,同时隐藏了实现细节,使得客户只需要关心抽象部分和实现部分的接口。但同时也增加了聚合对象的内部方法,需要开发者进行相应的设计和编程。

在这里插入图片描述

应用场景

桥接模式的应用场景包括:

  1. 将抽象部分和实现部分分离,使它们可以独立地变化。这在业务系统中开发一些非功能性需求时非常有用,例如监控、统计、鉴权、限流、事务、幂等、日志等,我们可以将这些附加功能与业务功能解耦,放到代理类统一处理,让程序员只需要关注业务方面的开发。
  2. 桥接模式还可以用在 RPC、缓存等应用场景中。

在这里插入图片描述

桥接模式和代理模式的区别

桥接模式和代理模式都是设计模式中的结构型模式,它们的区别在于:

  1. 目的不同 :代理模式主要是为了控制对象的访问(比如权限校验)或者为了更方便的访问对象(比如Binder中的代理使得跨进程调用方法就像调用本地方法一样);桥接模式主要是为了解决多个维度发生变化时带来的类爆炸问题。
  2. 实现方式不同 :代理模式和装饰模式中的代理角色和装饰者角色,都需要实现或者重写被代理者/被装饰者的方法,使得对用户来说是透明的,而桥接模式则不需要。

在这里插入图片描述

代码示例

Java实现桥接模式

下面是一个简单的Java实现桥接模式的示例:

// 抽象部分
public interface Shape {
    void draw();
}

// 具体实现部分
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
}

// 桥接类
public class ShapeBridge {
    private Shape shape;
    public ShapeBridge(Shape shape) {
        this.shape = shape;
    }
    public void draw() {
        shape.draw();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();
        ShapeBridge bridge1 = new ShapeBridge(circle);
        bridge1.draw();
        ShapeBridge bridge2 = new ShapeBridge(rectangle);
        bridge2.draw();
    }
}

在这个示例中,我们定义了一个抽象接口Shape,它包含一个draw()方法。然后我们定义了两个具体的实现类CircleRectangle,它们都实现了Shape接口。接着我们定义了一个桥接类ShapeBridge,它包含一个Shape类型的成员变量,并在构造函数中传入一个Shape对象。最后,我们在客户端代码中创建了一个Circle对象和一个Rectangle对象,并将它们分别传递给两个ShapeBridge对象。这样,我们就可以通过ShapeBridge对象来调用draw()方法,实现桥接模式的功能。

python实现桥接模式

桥接模式是一种对象结构型模式,它的主要目的是将抽象部分和实现部分分离,使它们可以独立地变化。下面是一个Python实现桥接模式的示例:

from abc import ABC, abstractmethod

# 抽象部分
class Bridge(ABC):
    @abstractmethod
    def operation(self):
        pass

# 具体实现部分
class Implementor(Bridge):
    def operation(self):
        print("Doing some work")

# 桥接类
class Adapter(Bridge):
    def __init__(self, implementor):
        self.implementor = implementor
    def operation(self):
        self.implementor.operation()
        print("Doing some other work")

# 客户端代码
if __name__ == '__main__':
    implementor = Implementor()
    adapter = Adapter(implementor)
    adapter.operation()

在这个示例中,我们定义了一个抽象类Bridge,它包含一个抽象方法operation()。然后我们定义了一个具体实现类Implementor,它实现了Bridge接口。接着我们定义了一个桥接类Adapter,它也实现了Bridge接口,并在构造函数中传入一个Implementor对象。最后,我们在客户端代码中创建了一个Implementor对象和一个Adapter对象,并将它们分别传递给两个operation()方法,从而实现了桥接模式的功能。

在这里插入图片描述

桥接模式在spring中的应用

桥接模式在Spring框架中有很多应用,其中最典型的应用就是使用AOP(面向切面编程)来实现各种非功能性需求,比如日志、事务、安全等。

在Spring中,通过桥接模式将切面(aspect)和应用逻辑分离,切面被定义为一个代理类,应用逻辑被定义为一个普通的Java类。这样,我们就可以在切面中加入监控、统计、事务、日志等处理代码,而不需要修改原有的业务逻辑代码。

具体来说,Spring中的AOP实现是基于代理的,它通过动态代理技术为业务类生成一个代理类,然后在代理类中加入处理代码。这样,在执行业务逻辑时,会自动触发代理类中的处理代码,从而实现了非功能性需求的透明化处理。

桥接模式在Spring框架中应用广泛,它可以将业务逻辑和附加功能分离,提高系统的灵活性和可维护性。

在这里插入图片描述

设计模式-原型模式

设计模式-建造者模式

设计模式-工厂模式

设计模式-单例模式

设计模式-适配器模式

设计模式-装饰器模式

设计模式-代理模式

设计模式-外观模式

你可能感兴趣的:(设计模式,设计模式,桥接模式,java)