设计模式-桥接模式(Bridge)


设计模式文档无水印可复制

一、桥接模式概述

1.1 什么是桥接模式

桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种桥接模式,也被称为柄体(Handle and Body)模式或接口(Interface)模式,是一种结构型设计模式。它的主要目的是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种分离可以通过组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

举个例子,假设有一个几何形状Shape类,从它能扩展出两个子类:圆形Circle和方形Square。你希望对这样的类层次结构进行扩展以使其包含颜色,所以你打算创建名为红色Red和蓝色Blue的形状子类。但是,由于你已有两个子类,所以总共需要创建四个类才能覆盖所有组合,例如蓝色圆形Blue­Circle和红色方形Red­Square。在层次结构中新增形状和颜色将导致代码复杂程度指数增长。在这种情况下,桥接模式就能起到作用,它将形状和颜色解耦,使得两者可以相对独立地变化。

1.2 简单实现桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立地变化。下面是一个简单的 Java 实现:

首先,我们创建一个抽象类 Shape,它有一个抽象方法 draw():

public abstract class Shape {
    public abstract void draw();
}

然后,我们创建两个实现了 Shape 接口的具体类:Circle 和 Square:

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

public class Square extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个正方形");
    }
}

接下来,我们创建一个桥接类 Color,它也实现了 Shape 接口,并持有一个 Shape 类型的引用:

public class Color extends Shape {
    private Shape shape;

    public Color(Shape shape) {
        this.shape = shape;
    }

    @Override
    public void draw() {
        setColor();
        shape.draw();
        resetColor();
    }

    private void setColor() {
        System.out.println("设置颜色");
    }

    private void resetColor() {
        System.out.println("重置颜色");
    }
}

最后,我们在主函数中测试这个桥接模式:

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape square = new Square();

        Shape coloredCircle = new Color(circle);
        Shape coloredSquare = new Color(square);

        coloredCircle.draw();
        coloredSquare.draw();
    }
}

运行结果:

设置颜色
画一个圆形
重置颜色
设置颜色
画一个正方形
重置颜色

二、使用桥接模式注意事项

使用桥接模式时需要注意以下几点:

  • 1、抽象部分和实现部分应该分离,不应该有过多的耦合。
  • 2、桥接模式适用于多个维度的变化,如果只有一两个维度的变化,使用继承会更加简单。
  • 3、桥接模式会增加系统的复杂度,需要谨慎使用。
  • 4、桥接模式要求正确选择和使用抽象类和接口,避免过度抽象或过于具体化。
  • 5、桥接模式的实现需要考虑对象的创建和管理,需要合理设计对象之间的关系和依赖关系。

三、实现桥接模式的方式

3.1 使用继承和组合的方式实现桥接模式

这种方式需要创建两个类,一个作为抽象类,另一个作为具体类。抽象类中定义了对抽象部分和实现部分的引用,具体类中实现了抽象部分的具体逻辑。

// 抽象部分
abstract class Abstraction {
    protected Implementation implementation;

    public void setImplementation(Implementation implementation) {
        this.implementation = implementation;
    }

    public abstract void operation();
}

// 具体部分
class ConcreteAbstraction extends Abstraction {
    @Override
    public void operation() {
        System.out.println("具体操作");
    }
}

// 实现部分
interface Implementation {
    void operationImpl();
}

class ConcreteImplementationA implements Implementation {
    @Override
    public void operationImpl() {
        System.out.println("实现A的操作");
    }
}

class ConcreteImplementationB implements Implementation {
    @Override
    public void operationImpl() {
        System.out.println("实现B的操作");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Abstraction abstraction = new ConcreteAbstraction();
        Implementation implementationA = new ConcreteImplementationA();
        Implementation implementationB = new ConcreteImplementationB();

        abstraction.setImplementation(implementationA);
        abstraction.operation(); // 输出:具体操作

        abstraction.setImplementation(implementationB);
        abstraction.operation(); // 输出:具体操作
    }
}

3.2 使用接口和内部类的方式实现桥接模式

这种方式需要创建一个接口,一个抽象类和一个内部类。抽象类中定义了对接口的引用,内部类中实现了抽象类的具体逻辑。

// 接口
interface Shape {
    void draw();
}

// 抽象部分
abstract class AbstractShape {
    protected Shape shape;

    public void setShape(Shape shape) {
        this.shape = shape;
    }

    public abstract void draw();
}

// 具体部分
class Rectangle extends AbstractShape {
    @Override
    public void draw() {
        shape.draw();
    }
}

class Circle extends AbstractShape {
    @Override
    public void draw() {
        shape.draw();
    }
}

// 内部类实现接口
class ShapeImpl implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制形状");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        AbstractShape abstractShape = new Rectangle();
        Shape shapeA = new ShapeImpl();
        Shape shapeB = new ShapeImpl();

        abstractShape.setShape(shapeA);
        abstractShape.draw(); // 输出:绘制形状

        abstractShape.setShape(shapeB);
        abstractShape.draw(); // 输出:绘制形状
    }
}
### 桥接模式的概念 桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,从而使两者可以独立变化[^1]。该模式通过引入一个桥梁接口,允许抽象类和实现类之间松散耦合,进而支持各自独立地扩展。 ### 主要角色 在桥接模式中有四个主要角色: - **Abstraction(抽象类)**: 定义了高层接口并持有一个指向Implementor类型的对象引用。 - **Refined Abstraction(细化抽象类)**: 扩展自Abstraction, 提供更具体的业务逻辑操作。 - **Implementor(实现接口/抽象类)**: 声明了所有具体实现类必需遵循的方法签名。 - **Concrete Implementor A/B/C...(具体实现类)**: 给出了Implementor所声明方法的具体实现版本[^3]。 ### 使用场景 当系统存在多维度的变化因素时,比如图形绘制程序中形状的颜色属性和填充样式相互独立变动;或是不同操作系统上相同应用程序的行为差异等情况下适用此模式[^2]。 ### Java代码示例:跨平台图像浏览器 下面是一个简单的Java例子展示了如何利用桥接模式构建一个可以在多种平台上运行的图片查看器应用: ```java // 抽象层 - 图像显示API interface ImageDisplay { void showImage(String imagePath); } // 实现层 - Windows平台上的具体实现 class WinImageDisplay implements ImageDisplay { @Override public void showImage(String imagePath) { System.out.println("Windows platform showing image at path:" + imagePath); } } // 实现层 - MacOSX平台上的具体实现 class MacImageDisplay implements ImageDisplay { @Override public void showImage(String imagePath) { System.out.println("MacOS X platform showing image at path:" + imagePath); } } // 抽象层 - 图片查看器基类 abstract class ImageViewer { protected ImageDisplay display; // 构造函数接收一个特定的操作系统实例化后的display对象作为参数传入 public ImageViewer(ImageDisplay disp){ this.display = disp; } abstract void viewImage(); } // 具体产品A - 文件夹视图下的图片查看器 class FolderImageViewer extends ImageViewer { private String folderPath; public FolderImageViewer(ImageDisplay disp, String fp){ super(disp); this.folderPath=fp; } @Override void viewImage() { display.showImage(folderPath+"/image.jpg"); } } ``` 在这个案例里,`ImageDisplay` 接口代表了抽象层面的功能定义,而 `WinImageDisplay`, `MacImageDisplay` 则提供了针对不同操作系统的具体实现方式。另一方面,`ImageViewer` 类负责处理高层次的应用逻辑,并依赖于底层提供的服务完成最终的任务执行过程。这样做的好处是可以轻松添加新的平台支持而不必修改现有代码结构,同时也方便维护各个组件之间的关系[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗油泼面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值