桥接模式(Bridge Pattern)
桥接模式是一种结构型模式(structural pattern)用于解决系统设计中两个或多个维度的变化,从而实现各自维度的独立扩展,而不影响到使用客户
下面用一个坦克游戏的示例演示了桥接模式的使用场景(这款游戏前期准备在window、linux上运营,以后可能会在手机、苹果机等等运行)
示例中的类型与结构图中的对应关系
TankGameApp = Client
Tank = Abstraction
Tank70(Tank90) = RefinedAbstraction
Platform = Implementor
NTPlatform = ConcreteImplementorA
LinuxPlatform = ConcreteImplementorB
这篇文章 中的毛笔+颜料的例子更形象的展现了桥接模式的用法。
下面用一个坦克游戏的示例演示了桥接模式的使用场景(这款游戏前期准备在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
这篇文章 中的毛笔+颜料的例子更形象的展现了桥接模式的用法。