java设计模式:03-02-桥接模式

桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式可以让一个类的两个变化维度独立扩展,而不会相互影响。

桥接模式的应用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要独立扩展时:例如,图形系统中的形状和颜色可以独立变化。
  • 避免类的多层继承结构:通过组合的方式代替继承,以减少复杂的继承关系。
  • 需要在运行时刻切换实现时:例如,不同平台上的图形绘制实现。

桥接模式的实现方式

1. 传统实现方式

思想:通过将抽象部分(Abstraction)和实现部分(Implementor)分离,使得它们可以独立变化。

实现方式

java 复制代码
// 实现部分接口
interface Implementor {
    void operationImpl();
}

// 具体实现部分
class ConcreteImplementorA implements Implementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorA operation");
    }
}

class ConcreteImplementorB implements Implementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorB operation");
    }
}

// 抽象部分
abstract class Abstraction {
    protected Implementor implementor;

    protected Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public abstract void operation();
}

// 扩展抽象部分
class RefinedAbstraction extends Abstraction {
    protected RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    public void operation() {
        System.out.println("RefinedAbstraction operation");
        implementor.operationImpl();
    }
}

// 客户端代码
public class BridgePattern {
    public static void main(String[] args) {
        Implementor implementorA = new ConcreteImplementorA();
        Abstraction abstractionA = new RefinedAbstraction(implementorA);
        abstractionA.operation();

        Implementor implementorB = new ConcreteImplementorB();
        Abstraction abstractionB = new RefinedAbstraction(implementorB);
        abstractionB.operation();
    }
}

优点

  • 将抽象部分与实现部分分离,降低了耦合性。
  • 抽象部分和实现部分可以独立变化,提高了系统的扩展性。
  • 符合单一职责原则,一个类只负责一个变化维度。

缺点

  • 增加了系统的复杂性,需要额外的代码来进行抽象和实现的分离。
2. 使用桥接模式实现图形和颜色的分离

思想:将图形和颜色作为两个独立变化的维度,通过桥接模式进行分离和组合。

实现方式

java 复制代码
// 实现部分接口
interface Color {
    void applyColor();
}

// 具体实现部分
class RedColor implements Color {
    public void applyColor() {
        System.out.println("Red color applied.");
    }
}

class GreenColor implements Color {
    public void applyColor() {
        System.out.println("Green color applied.");
    }
}

// 抽象部分
abstract class Shape {
    protected Color color;

    protected Shape(Color color) {
        this.color = color;
    }

    public abstract void draw();
}

// 扩展抽象部分
class Circle extends Shape {
    protected Circle(Color color) {
        super(color);
    }

    public void draw() {
        System.out.print("Circle drawn with ");
        color.applyColor();
    }
}

class Rectangle extends Shape {
    protected Rectangle(Color color) {
        super(color);
    }

    public void draw() {
        System.out.print("Rectangle drawn with ");
        color.applyColor();
    }
}

// 客户端代码
public class BridgePatternShapes {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new RedColor());
        redCircle.draw();

        Shape greenRectangle = new Rectangle(new GreenColor());
        greenRectangle.draw();
    }
}

优点

  • 将图形和颜色两个独立的维度分离开来,使得它们可以独立变化。
  • 可以在运行时动态地组合不同的图形和颜色,增加了系统的灵活性。
  • 符合开闭原则,可以方便地扩展新的图形和颜色。

缺点

  • 需要定义额外的类和接口,增加了系统的复杂性。
  • 在一定程度上,增加了系统的理解和维护难度。

总结

实现方式 优点 缺点
传统实现方式 将抽象部分与实现部分分离,降低耦合性,符合单一职责原则 增加了系统的复杂性,额外的代码和抽象层
使用桥接模式实现图形和颜色分离 图形和颜色可以独立变化,增加系统灵活性,符合开闭原则 增加了类和接口,增加了系统复杂性和理解难度

选择哪种实现方式应根据具体的需求和系统的复杂度来决定。如果系统中存在多个独立变化的维度,使用桥接模式可以降低耦合性,提高系统的扩展性和灵活性。

相关推荐
snow@li28 分钟前
SpringBoot:AOP日志切面全景梳理/原理+流程+实战+避坑
java·开发语言·spring boot
MC皮蛋侠客30 分钟前
Redis 系列(八):缓存设计模式与一致性——从 Cache Aside 到防雪崩
redis·缓存·设计模式
ma_king32 分钟前
Spring Boot 接入飞书自定义机器人
java·后端
2401_8949155333 分钟前
部署 GEO 优化源码常见报错排查:端口、伪静态、缓存问题解决
java·运维·服务器·后端·缓存·开源
七牛开发者1 小时前
Codex 实践系列 Vol.04:用 Goal 和 Plan 管住一个长任务
java·数据库·人工智能·github·copilot
我命由我123451 小时前
Android Drawable - gradient
android·java·java-ee·kotlin·android studio·android-studio·android runtime
淡海水1 小时前
15-07-YooAsset面试篇-Unity性能优化与内存管理
java·unity·面试·性能优化·c#·游戏引擎
snow@li2 小时前
Java:跨平台原理与JDK、JRE、JVM全景深度解析
java·开发语言·jvm
覆东流2 小时前
2.Java程序基础
java·开发语言·后端
snow@li2 小时前
SpringBoot:全套生命周期全景详解/应用级+Bean级
java·spring boot·rpc