【GOF95】在提出桥梁模式的时候指出,桥接模式是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。

抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待
实现化:抽象化给出的具体实现,就是实现化。
脱耦:所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。

桥接模式(Bridge)的为了使开发者完全抽象实现之间的模型,使用多重继承的方式解耦。这就强调了需要出现的三个标志:
  1:主操作纯虚类,主要定义实现的方法以及构造时(此处可以灵活)的使用的虚类对象。
  2:实现中使用的对象。
  3:桥接以上两者,然后按照纯虚方法调用
直接进入例子:
程序如下图:
             设计模式学习笔记--Bridge桥接模式

一、定义两个抽象类AbstractITPerson与AbstractCompany,其中AbstractITPerson抽象类中用到了AbstractCompany类对象                       
AbstractITPerson

 BridgeITWorker
{
    //主操作纯虚类,主要定义实现的方法以及构造时(此处可以灵活)的使用的虚类对象。
    abstract class AbstractITPerson
    {
        
public AbstractCompany Company; //实现中使用的对象。虚类对象:AbstractCompany

        
public abstract void Working();
        
public abstract void Studying();

        
public AbstractITPerson()
        {

        }
        
public AbstractITPerson(AbstractCompany absCompany)
        {
//在构造时使用虚类对象AbstractCompany
            this.Company = absCompany; 
        }

    }
}

AbstractCompany

 BridgeITWorker
{
    //定义一个抽象类AbstractCompany,表示公司
    abstract class AbstractCompany
    {
        
public abstract string GetCompanyName();
    }
}

二、定义ITPersons与Companies,它们分别是AbstractITPerson与AbstractCompany两个维度的扩展
ITPersons类

 BridgeITWorker
{
    //这是一个在IT人员方面不断扩展的维度
    #region 定义一个网络程序员类
    
class WebDeveloper : AbstractITPerson
    {
        
#region 构造函数
        
public WebDeveloper(AbstractCompany abC)
            : 
base(abC)
        {

        }
        
#endregion

        
public override void Studying()
        {
            Console.WriteLine(
"网络程序员正在学习充电");
        }

        
public override void Working()
        {
            Console.WriteLine(
"网络程序员正在工作");
        }
    }
    
#endregion

    
#region 定义一个数据库管理员类
    
class DataBaseManager : AbstractITPerson
    {
        
#region 构造函数
        
public DataBaseManager(AbstractCompany abC)
            : 
base(abC)
        {

        }
        
#endregion

        
public override void Studying()
        {
            Console.WriteLine(
"数据库管理员正在学习充电");
        }

        
public override void Working()
        {
            Console.WriteLine(
"数据库管理员正在工作");
        }
    }
    
#endregion

    
#region 定义一个客户服务类
    
class CustomerSupporter : AbstractITPerson
    {
        
#region 构造函数
        
public CustomerSupporter(AbstractCompany abC)
            : 
base(abC)
        {

        }
        
#endregion

        
public override void Studying()
        {
            Console.WriteLine(
"客户支持人员正在学习充电");
        }

        
public override void Working()
        {
            Console.WriteLine(
"客户支持人员正在工作");
        }
    }
    
#endregion
}

Companies类

 BridgeITWorker
{
    //这是一个在公司方面不断扩展的维度
    #region 定义一个IT公司:IBM,它继承抽象类AbstractCompany 
    
class IBMCompany : AbstractCompany
    {
        
public override string GetCompanyName()
        {
            
return "IBM公司";
        }
    }
    
#endregion

    
#region 定义一个IT公司:Microsoft,它继承抽象类AbstractCompany
    
class MicrosoftCompany : AbstractCompany
    {
        
public override string GetCompanyName()
        {
            
return "Microsoft公司";
        }
    }
    
#endregion

    
#region 定义一个IT公司:Oracle,它继承抽象类AbstractCompany
    
class OracleCompany : AbstractCompany
    {
        
public override string GetCompanyName()
        {
            
return "Oracle公司";
        }
    }
    
#endregion


}

三、应用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BridgeITWorker
{
    
class Program
    {
        
static void Main(string[] args)
        {
            Console.WriteLine(
"IBM的IT工作人员:");
            AbstractITPerson absITperson 
= new WebDeveloper(new IBMCompany());
            Console.WriteLine(absITperson.Company.GetCompanyName());
            absITperson.Studying();
            absITperson.Working();
            Console.WriteLine();

            Console.WriteLine(
"MicroSoft的IT工作人员:");
            absITperson 
= new DataBaseManager(new MicrosoftCompany());
            Console.WriteLine(absITperson.Company.GetCompanyName());
            absITperson.Studying();
            absITperson.Working();
            Console.WriteLine();

            Console.WriteLine(
"Oracle的IT工作人员:");
            absITperson 
= new DataBaseManager(new OracleCompany());
            Console.WriteLine(absITperson.Company.GetCompanyName());
            absITperson.Studying();
            absITperson.Working();

            Console.ReadLine();
        }
    }
}

以上的桥接模式的实现主要有三个关系:AbstractITPerson,AbstractCompany,主实现,可以看到AbstractITPerson完全隐藏了其实现的具体细节,AbstractCompany也隐藏了其具体实现的细节。这就是在在两个纬度上的解耦。 如此做法,也是为了程序的可扩展性。
运行效果如下:
            设计模式学习笔记--Bridge桥接模式 

前往:设计模式学习笔记清单

相关文章: