讲述的文章很多,概念的话就不跟着抄了 ,这篇 http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 不错,可以参考。
下面只说说我理解的几个重点:
1,掌握桥接,关键在于提炼出变化的维度。如果有2个独立变化的纬度,每一个纬度的增加或变化都会引起与另一个纬度所有项的排列组合的话,为避免具体类的类爆炸,那么你就应当使用桥接。
桥接的类图如下所示:
各纬度的组合靠组合而不再是单一继承。相当于我不再是实力化一个具有2个纬度特征的具体类,而是实力化一个具备其中一个纬度特征的类,然后再指定这个类另一个纬度的属性。
所谓桥接的桥说白了就是这2个纬度间连接桥。
2,如果你还有点不明白的话,请参考以下只用继承而不用组合的解决方案导致的结果:
其中蓝色是需求变化或者说纬度增加新项导致增加的类。每一个纬度增加新项,增加的的新类数量是另一个纬度所有项的数量。而使用桥接呢,一个就是一个而已。
为了实现这个功能还有很多文章没提到的一点,其实子类中的实现的方法被提高到基类里去了。即桥接组合的这一部分实现体现在基类中了。(当然应该是这样,单一继承中那些过多重复的实现代码就是你应该采用更好的方法的提示)
简言之,如果你的需求有2个独立变化的纬度(注意是独立),之间又有组合关系的话(排列组合关系),需要单独的管理这2个纬度,避免过多的具体类和僵硬联系的情况下,桥接是你很好的选择。
桥接的代码如下
一个维度:
public abstract class ImpLog
{
public abstract void Execute(string msg);
}
public class NImpLog : ImpLog
{
public override void Execute(string msg)
{
//...... .NET平台
}
}
public class JImpLog : ImpLog
{
public override void Execute(string msg)
{
//...... Java平台
}
}
另一个维度
public abstract class Log
{ protected ImpLog implementor;
public ImpLog Implementor
{ set { implementor = value; }
}
public virtual void Write(string log)
{
implementor.Execute(log);
}
}
public class DatabaseLog : Log
{
public override void Write(string log)
{
implementor.Execute(log);
}
}
public class TextFileLog : Log
{
public override void Write(string log)
{
implementor.Execute(log);
}
}
客户端:
class App
{
public static void
{
//.NET平台下的Database Log
Log dblog = new DatabaseLog();
dblog.Implementor = new NImpLog();
dblog.Write();
//Java平台下的Text File Log
Log txtlog = new TextFileLog();
txtlog.Implementor = new JImpLog();
txtlog.Write();
}
}