桥接模式解决的是双维度或多维的变化的问题。
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。[GOF 《设计模式》]
结构图:
不多废话,先看code,待会解释这个UML。
背景介绍:现在要开发个坦克游戏,要求有PC端和手机端版本,坦克型号有各种型号例子中T50和T75为例。坦克的基本功能:Shot、Run等。
public abstract class Tank { protected TankPlatformImplementation tankImpl; public Tank(TankPlatformImplementation tankImpl) { this.tankImpl = tankImpl; } public abstract void Shot(); public abstract void Run(); public abstract void Stop(); }
public abstract class TankPlatformImplementation//这个自然是做桥接用的 { public abstract void MoveTankTo();//其实代码很多都重复(如移动Move和Run),如果不用桥接的话一方面会产生重复代码 public abstract void DrawTank(); public abstract void DoShot(); }
那么现在看看TankPlatformImplementation的两个子类吧:
public class MobileTankImplementation:TankPlatformImplementation { public override void DoShot() { throw new NotImplementedException(); } public override void DrawTank() { throw new NotImplementedException(); } public override void MoveTankTo() { throw new NotImplementedException(); } }
public class PCTankImplementation:TankPlatformImplementation { public override void MoveTankTo() { throw new NotImplementedException(); } public override void DoShot() { throw new NotImplementedException(); } public override void DrawTank() { throw new NotImplementedException(); } }
现在就看看型号是怎么继承Tank的吧,还有看看他的代码是怎么复用。
public class T50:Tank { public T50(TankPlatformImplementation tankImpl) : base(tankImpl) { } public override void Run() { throw new NotImplementedException(); } public override void Shot() { throw new NotImplementedException(); } public override void Stop() { throw new NotImplementedException(); } }
public class T75:Tank { public T75(TankPlatformImplementation tankImpl) : base(tankImpl) { } public override void Run() { throw new NotImplementedException(); } public override void Shot() { throw new NotImplementedException(); } public override void Stop() { throw new NotImplementedException(); } }
就T75而言,它自然是继承了Tank了,然后它要对Run等进行了重写。那么既然T75继承了Tank了,就当然用有了它的protect的方法,就是拥有了这个TankPlatformImplementation类,它当然可以调用TankPlatformImplementation 的MoveTankTo()等方法,是不是方法复用了。
上面说的有点乱,主要是没有uml图辅助说明。时间也仓储,当做日记记录了。
参考文献:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 他这里说的比我还清楚。