一、定义
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。
当一个抽象可能有多个实现时,通常用继承来进行协调。抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
如果一个抽象类或接口有多个具体实现子类,而这些子类之中有内容或概念上重叠,需要我们把抽象的共同部分各自独立开来:即原来是准备放在一个接口里,现在需要设计两个接口——抽象接口和行为接口。然后再分别针对各自的具体子类定义抽象接口和行为接口的方法和调用关系。
将抽象部分与实现部分分离,使它们都可以独立的变化。
二、实例:
在Windows系统上我们有一个写入操作,这个写入操作多重类型(txtxml)
但是现在功能不仅仅只局限在Windows平台上,需要Mac上也要实现。并且还要增加写入类型(bit流)
抽象系统:
public abstract class OS { public abstract void WriteTxt(); public abstract void WriteXML(); }
实现:
public class Mac : OS { public Mac() { Console.WriteLine("Mac系统"); } public override void WriteTxt() { Console.WriteLine("WriteType : Txt"); } public override void WriteXML() { Console.WriteLine("WriteType : XML"); } } public class Win : OS { public Win() { Console.WriteLine("Windows 系统"); } public override void WriteTxt() { Console.WriteLine("WriteType : Txt"); } public override void WriteXML() { Console.WriteLine("WriteType : XML"); } }
抽象写入操作:
public abstract class IOHelp { public OS os;//搭个桥 public IOHelp(OS _os) { os = _os; } public abstract void Write();
}
实现:
public class TxtHelp : IOHelp { public TxtHelp(OS _os):base(_os) { } public override void Write() { os.WriteTxt(); } } public class XMLHelp : IOHelp { public XMLHelp(OS _os) : base(_os) { } public override void Write() { os.WriteXML(); } }
客户端:
//---------------------桥接模式------------------------ Bridge.OS mac = new Bridge.Mac(); Bridge.IOHelp txt = new Bridge.XMLHelp(mac); txt.Write(); Console.ReadKey();
三、总结
老方式:我们抽象写方式(因为有多种写类型),后续需要在不同平台运行不同的写入方式。
那就到了我们:桥接模式
抽象系统,抽象写入方式(桥接一下系统),使用系统的具体执行方法。
-----例子也是难想啊····-----