温故而知新:设计模式之桥接模式(Bridge)

简介: 当一个应用,有着多个维度的变化时,桥模式可将多个维度的变化独立开来(即解耦),最直观的好处就是可有效减少子类的数量。 场景:假如我们要开发一个数据程序程序,导出的数据格式暂定为txt,xml,或直接导入到其它数据库(注:导出格式的需要变化,可以理解为功能维度上的变化),而且我们还要让这套程序能运行于多种平台(windows,linux,freebsd,macos.

当一个应用,有着多个维度的变化时,桥模式可将多个维度的变化独立开来(即解耦),最直观的好处就是可有效减少子类的数量。

场景:假如我们要开发一个数据程序程序,导出的数据格式暂定为txt,xml,或直接导入到其它数据库(注:导出格式的需要变化,可以理解为功能维度上的变化),而且我们还要让这套程序能运行于多种平台(windows,linux,freebsd,macos...)上,即跨平台运行(注:可支持多平台的需要变化,可理解为平台需求维度上的变化)

如果按传统思维:每种格式的导出程序都要对应写出N个版本的实现,如果导出格式数为M,可支持的平台数为N,则最终的子类数目一定在M*N之上,这将导致一个类爆炸的结局,另外可维护性也一般般,属于紧耦合设计。

桥模式的做法:把多个维度的变化抽象出来,并且用组合的方案处理。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 桥模式示例--菩提树下的杨过
     public   abstract   class  DataExporter
    {
        
protected  OS os; // 关键:这里放一个平台的抽象类,以对象组合的方式实现依赖倒置

        
public   abstract   void  Export();

        
public  DataExporter(OS os)
        {
            
this .os  =  os;
        }
    }

    
public   abstract   class  OS
    {
        
public   abstract   void  WriteToTxt();

        
public   abstract   void  WriteToDB();

        
public   abstract   void  WriteToXML();
    }

    
public    class  WinOS : OS
    {
        
public   override   void  WriteToTxt()
        {
            Console.WriteLine(
" Windows系统上写txt文件的实现! " );
        }

        
public   override   void  WriteToDB()
        {
            Console.WriteLine(
" Windows系统上导入数据库的实现! " );
        }

        
public   override   void  WriteToXML()
        {
            Console.WriteLine(
" Windows系统上写Xml文件的实现! " );
        }
    }

    
public    class  LinuxOS : OS 
    {
        
public   override   void  WriteToTxt()
        {
            Console.WriteLine(
" Linux系统上写txt文件的实现! " );
        }

        
public   override   void  WriteToDB()
        {
            Console.WriteLine(
" Linux系统上导入数据库的实现! " );
        }

        
public   override   void  WriteToXML()
        {
            Console.WriteLine(
" Linux系统上写Xml文件的实现! " );
        }
    }

    
public    class  MacOS : OS
    {
        
public   override   void  WriteToTxt()
        {
            Console.WriteLine(
" MacOS系统上写txt文件的实现! " );
        }

        
public   override   void  WriteToDB()
        {
            Console.WriteLine(
" MacOS系统上导入数据库的实现! " );
        }

        
public   override   void  WriteToXML()
        {
            Console.WriteLine(
" MacOS系统上写Xml文件的实现! " );
        }
    }

    
public    class  FreeBsdOS : OS
    {
        
public   override   void  WriteToTxt()
        {
            Console.WriteLine(
" FreeBsd系统上写txt文件的实现! " );
        }

        
public   override   void  WriteToDB()
        {
            Console.WriteLine(
" FreeBsd系统上导入数据库的实现! " );
        }

        
public   override   void  WriteToXML()
        {
            Console.WriteLine(
" FreeBsd系统上写Xml文件的实现! " );
        }
    }

    
public   class  TxtDataExporter : DataExporter
    {
        
public  TxtDataExporter(OS os)
            : 
base (os)
        {

        }

        
public   override   void  Export()
        {
            os.WriteToTxt();
        }
    }

    
public   class  XmlDataExporter : DataExporter
    {
        
public  XmlDataExporter(OS os)
            : 
base (os)
        {

        }

        
public   override   void  Export()
        {
            os.WriteToXML();
        }
    }

    
public   class  DatabaseDataExporter : DataExporter
    {
        
public  DatabaseDataExporter(OS os)
            : 
base (os)
        {

        }

        
public   override   void  Export()
        {
            os.WriteToDB();
        }
    }

 

客户程序调用示例:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 客户程序
     class  Program
    {
        
static   void  Main( string [] args)
        {
            DataExporter export 
=   new  TxtDataExporter( new  WinOS()); // 这样就得到了一个Windows平台上的txt格式导出实例
            export.Export();

            Console.ReadKey();
        }
    }

 

类图:

img_fe964e775b20bcb4518c6a24c736cd67.png

后记:简单算一下类的个数前后变化,不使用桥模式的情况下:3种格式 * 4种平台 = 12个类,然后再加上2个抽象类,一共是14个类,使用桥模式后:3种格式 + 4种平台 + 2个抽象类 = 9个类

 

目录
相关文章
|
设计模式 开发者
【设计模式】第七篇:和我一起简单认识桥接模式
实现的意思并不是指抽象的派生类,而是指通过组合来代替继承关系,从而降低抽象和具体实现产品两个可变换维度之间的耦合,就像我们的相机品牌和相机产品类型之间的分离
156 4
|
设计模式 Java
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
【设计模式】JAVA Design Patterns——Bridge(桥接模式)
|
8月前
|
关系型数据库 Java MySQL
【设计模式】【结构型模式】桥接模式(Bridge)
一、入门 什么是桥接模式? 桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,让它们可以独立变化。简单来说,它像一座“桥”连接了两个维度的变化,避免用继承导致代
434 10
|
12月前
|
设计模式 前端开发 数据库
「全网最细 + 实战源码案例」设计模式——桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,通过将抽象部分与实现部分分离,使它们可以独立变化,从而降低代码耦合度,避免类爆炸,提高可扩展性。其结构包括实现类接口、具体实现类、抽象类和精确抽象类。适用于多维度扩展类、隐藏实现细节、简化庞杂类以及运行时切换实现方法的场景。优点包括高扩展性、隐藏实现细节、遵循开闭原则和单一职责原则;缺点是可能增加代码复杂度。示例中展示了不同操作系统播放不同格式视频文件的实现。
305 19
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
171 19
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
107 1
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
170 0
|
设计模式 JavaScript
js设计模式【详解】—— 桥接模式
js设计模式【详解】—— 桥接模式
201 6