动机:对象具有两个以上的维度变化。如何利用面向对象技术来解决该问题,而不引入额外的复杂度。
意图:将抽象部分与实现部分分离(一个事物中多个维度变化相分离),使得它们都可以独立地变化。
基本Code:
public abstract class Tank
{
public abstract void Shot();
public abstract void Run();
public abstract void Stop();
}
public class T75:Tank
{
public override void Shot()
{
//T75
}
public override void Run()
{
//T75
}
public override void Stop()
{
//T75
}
}
public class T50:Tank
{
public override void Shot()
{
//T50
}
public override void Run()
{
//T50
}
public override void Stop()
{
//T50
}
}
public class PCT50:T50
{
//….
}
public class MobileT50:T50
{
//…
}
public class PCT75:T75
{
//…
}
public class MobileT75:T75
{
//…
}
在此代码中,注意两个变化点,Tank的型号和平台都在变化,这样可能产生大量的重复代码。在此基础上使用桥接模式如下:
public abstract class TankPlatformImplementation
{
public abstract void MoveTo(Point to);
public abstract void DrawTank();
public abstract void DoShot();
}
public class PCTankPlatformImplementation: TankPlatformImplementation
{
public override void MoveTo(Point to)
{
}
public override void DrawTank()
{
}
public override void DoShot()
{
}
}
public class MobileTankPlatformImplementation: TankPlatformImplementation
{
public override void MoveTo(Point to)
{
}
public override void DrawTank()
{
}
public override void DoShot()
{
}
}
public abstract class Tank
{
protected TankPlatformImplementation tankImpl;
public Tank(TankPlatformImplementation tankImpl)
{
This.tankImpl=tankImpl;
}
public TankPlatformImplementation TankImpl
{
get{ return tankImpl;}
set{ tankImpl=value;}
}
public abstract void Shot();
public abstract void Run();
public abstract void Stop();
}
public class T50:Tank
{
public T50(TankPlatformImplementation tankImpl):base(tankImpl)
{
}
public override void Shot()
{
// T50…
tankImpl.DoShot();
}
public override void Run()
{
//T50….
//tankImpl
}
public override void Stop()
{
//T50…
//tankImpl
}
}
public class T75:Tank
{
public T75(TankPlatformImplementation tankImpl):base(tankImpl)
{
}
public override void Shot()
{
// T75…
tankImpl.DoShot();
}
public override void Run()
{
//T75….
//tankImpl
}
public override void Stop()
{
//T75
//tankImpl
}
}
class App
{
static void Main()
{
TankPlatformImplementation tankImpl=new MobileTankPlatformImplementation();
T50 tank=new T50(tankImpl);
}
}
Bridge模式结构图如下所示:
Bridge模式要点:
1、 Bridge模式使用“对象间的组合关系”解耦了抽象与实现之间固有的绑定关系,使用抽象和实现可以沿着各自的维度的变化。
2、 所谓抽象和实现沿着各自维度的变化,即“子类化”它们,比如不同的Tank型号子类和不同的平台子类。得到各个子类之后,便可以任意组合它们,从而获得不同平台的不同型号。
3、 Bridge模式有时候类似于多继承方案,但是多继承往往违背单一职责原则(即一个类只有一个变化点的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
4、 Bridge模式一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈――换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。
在使用此模式的时候,代价是比较大的哈。