【GOF95】在提出桥梁模式的时候指出,桥接模式是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
【GOF95】在提出桥梁模式的时候指出,桥接模式是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
抽象化:存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待
实现化:抽象化给出的具体实现,就是实现化。
脱耦:所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联。将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。
桥接模式(Bridge)的为了使开发者完全抽象实现之间的模型,使用多重继承的方式解耦。这就强调了需要出现的三个标志:
1:主操作纯虚类,主要定义实现的方法以及构造时(此处可以灵活)的使用的虚类对象。
2:实现中使用的对象。
3:桥接以上两者,然后按照纯虚方法调用
直接进入例子:
程序如下图:
一、定义两个抽象类AbstractITPerson与AbstractCompany,其中AbstractITPerson抽象类中用到了AbstractCompany类对象
AbstractITPerson类
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 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类
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BridgeITWorker
{
//定义一个抽象类AbstractCompany,表示公司
abstract class AbstractCompany
{
public abstract string GetCompanyName();
}
}
二、定义ITPersons与Companies,它们分别是AbstractITPerson与AbstractCompany两个维度的扩展
ITPersons类
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 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类
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 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也隐藏了其具体实现的细节。这就是在在两个纬度上的解耦。 如此做法,也是为了程序的可扩展性。
运行效果如下:
前往:设计模式学习笔记清单