【设计模式】通过简单案例学习桥接模式

简介: 【设计模式】通过简单案例学习桥接模式

桥接模式


  桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

  在有多种可能会变化的情况下,用继承会造成类很多,扩展起来不灵活,因此使用桥接模式将抽象部分与实现部分分离,使它们都可以独立的变化。 桥接模式优点:

  • 1、抽象和实现的分离。
  • 2、优秀的扩展能力。
  • 3、实现细节对客户透明。

  下面结合案例进行简单的介绍。


案例分析


  本次采用的是比较经典的大家都熟悉的案例,是某年软件设计师的试题。具体如下:

  现欲实现一个图像浏览系统,要求该系统能够显示BMP、JPEG和GIF三种格式的文件,并且能够在 Windows和 Linux两种操作系统上运行。系统首先将BMP、JPEG和GIF三种格式的文件解析为像素矩阵,然后将像素矩阵显示在屏幕上。系统需具有较好的扩展性以支持新的文件格式和操作系统。为满足上述需求并减少所需生成的子类数目,采用桥接( Bridge设计模式进行设计,所得类图如下图所示。image.png

  通过题干分析可以知道需要读取的文件格式可能是多种的,而且可能在不同的操作系统中去展示图像,而需要将文件的展示与系统的实现集合起来。经过分析,文件的格式可能是多种多样的,操作系统也是多种多样的,因此使用桥接模式对该题设计比较好。 下面开始进行简单代码实现。下图是建好的文件。

image.png


编写图像展示抽象类


编写图像展示抽象类,是为了在后期,新加入不同的操作系统之后,只需要集成此抽象类,就可以快速实现不同类型文件的图像展示。使图像文件类型与操作系统之间进行解耦。 编写代码如下,只有一个图像输出的方法。

/**
 * @ClassName ImageHandler
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public abstract class ImageHandler {
    public abstract void doPaint(PictureElement pe);
}


其中PictureElement 是展示的图像像素点,由于是模拟展示,本次针对此对象只显示文件名称。


/**
 * @ClassName PictureElement
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class PictureElement {
    private String fileName;
    public String getFileName() {
        return fileName;
    }
    public PictureElement(String fileName) {
        this.fileName = fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}


Linux系统展示


/**
 * @ClassName LinuxImageImpl
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class LinuxImageImpl extends ImageHandler {
    @Override
    public void doPaint(PictureElement pe) {
        System.out.println("Linux 输出图像。文件名称是:" + pe.getFileName());
    }
}


Windows系统展示


/**
 * @ClassName WinImageImpl
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class WinImageImpl extends ImageHandler {
    @Override
    public void doPaint(PictureElement pe) {
        System.out.println("Windows 输出图像。文件名称是:" + pe.getFileName());
    }
}


编写图像文件处理类


创建一个抽象ImageInfo的类,其中包含图像显示类和图像文件转换类两个。

/**
 * @ClassName ImageInfo
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public abstract class ImageInfo {
    protected ImageHandler imageHandler;
    public void setImageHandler(ImageHandler image) {
        this.imageHandler = image;
    }
    public abstract void parseFile(String fileName);
}


编写不同文件处理方法


JPEG文件处理。

/**
 * @ClassName JPEG
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class JPEG extends ImageInfo {
    @Override
    public void parseFile(String fileName) {
        System.out.println("将JPEG格式文件转成图像像素矩阵对象");
        PictureElement pe = new PictureElement(fileName);
        imageHandler.doPaint(pe);
    }
}


GIF文件处理。


/**
 * @ClassName GIF
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class GIF extends ImageInfo {
    @Override
    public void parseFile(String fileName) {
        System.out.println("将GIF格式文件转成图像像素矩阵对象");
        PictureElement pe = new PictureElement(fileName);
        imageHandler.doPaint(pe);
    }
}


BMP文件处理。


/**
 * @ClassName BMP
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class BMP extends ImageInfo {
    @Override
    public void parseFile(String fileName) {
        System.out.println("将BMP格式文件转成图像像素矩阵对象");
        PictureElement pe = new PictureElement(fileName);
        imageHandler.doPaint(pe);
    }
}


运行


通过main运行一下简单的测试类可以看到运行结果如下。

/**
 * @ClassName MainApplication
 * @Description:
 * @Author 公众号:Java全栈架构师
 * @Version V1.0
 **/
public class MainApplication {
    public static void main(String[] args) {
        //在 Linux 查看GIF图片
        ImageInfo imageInfoGIF = new GIF();
        LinuxImageImpl linuxImage = new LinuxImageImpl();
        imageInfoGIF.setImageHandler(linuxImage);
        imageInfoGIF.parseFile("test.GIF");
        //在 Windows 查看JPEG图片
        ImageInfo imageInfoJPEG = new JPEG();
        WinImageImpl winImage = new WinImageImpl();
        imageInfoJPEG.setImageHandler(winImage);
        imageInfoJPEG.parseFile("test.JPEG");
    }
}


运行结果:


将GIF格式文件转成图像像素矩阵对象
Linux 输出图像。文件名称是:test.GIF
将JPEG格式文件转成图像像素矩阵对象
Windows 输出图像。文件名称是:test.JPEG
复制代码

image.png


  好了,一个简单的桥接模式就介绍完成了,学习设计模式的时候,尽量结合熟悉的案例进行分析,这样的话就会有事半功倍的奇效,也更容易理解。大家可以尝试着在项目中使用设计模式的方式进行开发。


目录
相关文章
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
3月前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
27 1
|
3月前
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
|
2月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
45 0
|
4月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
4月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
4月前
|
设计模式 缓存 项目管理
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 桥接模式
js设计模式【详解】—— 桥接模式
73 6
|
6月前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
45 2