下面用一个坦克游戏的示例演示了桥接模式的使用场景(这款游戏前期准备在window、linux上运营,以后可能会在手机、苹果机等等运行)
示例中的类型与结构图中的对应关系
TankGameApp = Client
Tank = Abstraction
Tank70(Tank90) = RefinedAbstraction
Platform = Implementor
NTPlatform = ConcreteImplementorA
LinuxPlatform = ConcreteImplementorB
public
class
TankGameApp
{
public static void Main()
{
// 如果在NT平台下使用该游戏
NTPlatform ntPlatform = new NTPlatform();
Tank nTank = new Tank70(ntPlatform);
nTank.Move();
nTank.Shot();
nTank.Stop();
// 如果在NT平台下使用该游戏
LinuxPlatform linuxPlatform = new LinuxPlatform();
Tank lTank = new Tank90(linuxPlatform);
lTank.Move();
lTank.Shot();
lTank.Stop();
Console.ReadLine();
}
}
public abstract class Tank
{
public abstract void Draw();
public abstract void Move();
public abstract void Stop();
// shot方法不涉及调用系统接口
public abstract void Shot();
}
public class Tank70 : Tank
{
Platform platform;
public Tank70(Platform platform)
{
this .platform = platform;
}
public override void Draw()
{
platform.Draw();
}
public override void Move()
{
platform.Move();
}
public override void Stop()
{
platform.Stop();
}
public override void Shot()
{
Console.WriteLine( " Tank70开火! " );
}
}
public class Tank90 : Tank
{
Platform platform;
public Tank90(Platform platform)
{
this .platform = platform;
}
public override void Draw()
{
platform.Draw();
}
public override void Move()
{
platform.Move();
}
public override void Stop()
{
platform.Stop();
}
public override void Shot()
{
Console.WriteLine( " Tank90开火! " );
}
}
#region 游戏运行平台
public abstract class Platform
{
public abstract void Draw();
public abstract void Move();
public abstract void Stop();
}
public class NTPlatform : Platform
{
public override void Draw()
{
// 调用windows接口绘制坦克外形,等等……
Console.WriteLine( " windows平台下绘制坦克外形。 " );
}
public override void Move()
{
Console.WriteLine( " windows平台下坦克移动。 " );
}
public override void Stop()
{
Console.WriteLine( " windows平台下坦克停止。 " );
}
}
public class LinuxPlatform : Platform
{
public override void Draw()
{
// 调用Linux接口绘制坦克外形,等等……
Console.WriteLine( " Linux平台下绘制坦克外形。 " );
}
public override void Move()
{
Console.WriteLine( " Linux平台下坦克移动。 " );
}
public override void Stop()
{
Console.WriteLine( " Linux平台下坦克停止。 " );
}
}
#endregion
{
public static void Main()
{
// 如果在NT平台下使用该游戏
NTPlatform ntPlatform = new NTPlatform();
Tank nTank = new Tank70(ntPlatform);
nTank.Move();
nTank.Shot();
nTank.Stop();
// 如果在NT平台下使用该游戏
LinuxPlatform linuxPlatform = new LinuxPlatform();
Tank lTank = new Tank90(linuxPlatform);
lTank.Move();
lTank.Shot();
lTank.Stop();
Console.ReadLine();
}
}
public abstract class Tank
{
public abstract void Draw();
public abstract void Move();
public abstract void Stop();
// shot方法不涉及调用系统接口
public abstract void Shot();
}
public class Tank70 : Tank
{
Platform platform;
public Tank70(Platform platform)
{
this .platform = platform;
}
public override void Draw()
{
platform.Draw();
}
public override void Move()
{
platform.Move();
}
public override void Stop()
{
platform.Stop();
}
public override void Shot()
{
Console.WriteLine( " Tank70开火! " );
}
}
public class Tank90 : Tank
{
Platform platform;
public Tank90(Platform platform)
{
this .platform = platform;
}
public override void Draw()
{
platform.Draw();
}
public override void Move()
{
platform.Move();
}
public override void Stop()
{
platform.Stop();
}
public override void Shot()
{
Console.WriteLine( " Tank90开火! " );
}
}
#region 游戏运行平台
public abstract class Platform
{
public abstract void Draw();
public abstract void Move();
public abstract void Stop();
}
public class NTPlatform : Platform
{
public override void Draw()
{
// 调用windows接口绘制坦克外形,等等……
Console.WriteLine( " windows平台下绘制坦克外形。 " );
}
public override void Move()
{
Console.WriteLine( " windows平台下坦克移动。 " );
}
public override void Stop()
{
Console.WriteLine( " windows平台下坦克停止。 " );
}
}
public class LinuxPlatform : Platform
{
public override void Draw()
{
// 调用Linux接口绘制坦克外形,等等……
Console.WriteLine( " Linux平台下绘制坦克外形。 " );
}
public override void Move()
{
Console.WriteLine( " Linux平台下坦克移动。 " );
}
public override void Stop()
{
Console.WriteLine( " Linux平台下坦克停止。 " );
}
}
#endregion
这篇文章 中的毛笔+颜料的例子更形象的展现了桥接模式的用法。