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();
    }
}

优点

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

缺点

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

总结

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

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

相关推荐
试行11 分钟前
Android实现自定义下拉列表绑定数据
android·java
茜茜西西CeCe16 分钟前
移动技术开发:简单计算器界面
java·gitee·安卓·android-studio·移动技术开发·原生安卓开发
救救孩子把21 分钟前
Java基础之IO流
java·开发语言
小菜yh22 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.29 分钟前
Java键盘输入语句
java·开发语言
浅念同学29 分钟前
算法.图论-并查集上
java·算法·图论
立志成为coding大牛的菜鸟.42 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞42 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
仙魁XAN1 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
爱上语文2 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring