温故而知新:设计模式之桥接模式(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个类

 

目录
相关文章
|
2月前
|
设计模式
设计模式之桥接模式
设计模式之桥接模式
|
2月前
|
设计模式 Linux Windows
【设计模式】桥接模式
【设计模式】桥接模式
|
3月前
|
设计模式 Oracle Java
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
设计模式--- 桥接模式、JDBC 源码剖析(桥接)
|
5月前
|
设计模式 前端开发
二十三种设计模式全面解析-深入解析桥接模式:解锁软件设计的灵活性
二十三种设计模式全面解析-深入解析桥接模式:解锁软件设计的灵活性
|
5月前
|
设计模式 Java 开发者
Java设计模式【七】:桥接模式
Java设计模式【七】:桥接模式
22 0
|
6月前
|
设计模式 Java 关系型数据库
认真学习设计模式之桥接模式(Bridge Pattern)
认真学习设计模式之桥接模式(Bridge Pattern)
39 0
|
7月前
|
设计模式
结构型设计模式06-桥接模式
结构型设计模式06-桥接模式
22 0
|
20天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
|
22天前
|
设计模式
【设计模式系列笔记】桥接模式
桥接模式(Bridge Pattern)是一种结构性设计模式,它将抽象部分与实现部分分离,使它们可以独立变化而互不影响。桥接模式通过组合而不是继承的方式来实现这种分离。
31 6
|
4月前
|
设计模式 Java 关系型数据库
聊聊Java设计模式-桥接模式
桥接(Bridge)模式是指将抽象部分与实现部分相分离,使它们都可以独立的发生变化。
46 7
聊聊Java设计模式-桥接模式