桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。git
Implementor类:github
namespace BridgePattern.BasicStructure { abstract class Implementor { public abstract void Operation(); } }
ConcreteImplementorA类:编程
namespace BridgePattern.BasicStructure { class ConcreteImplementorA : Implementor { public override void Operation() { Console.WriteLine("具体实现A的方法执行"); } } }
ConcreteImplementorB类:ide
namespace BridgePattern.BasicStructure { class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("具体实现B的方法执行"); } } }
Abstraction类:this
namespace BridgePattern.BasicStructure { abstract class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } }
RefinedAbstraction类:spa
namespace BridgePattern.BasicStructure { class RefinedAbstraction : Abstraction { public override void Operation() { implementor.Operation(); } } }
客户端调用代码:设计
static void Main(string[] args) { try { {//BasicStructure Abstraction abstraction = new RefinedAbstraction(); abstraction.SetImplementor(new ConcreteImplementorA()); abstraction.Operation(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果以下:3d
场景模拟:现有多种手机品牌,每种手机品牌的手机又都有某一些软件,好比:游戏软件,通信录,相机,听歌......code
好比咱们有M和N两种手机品牌,M手机和N手机都有X和Y两种软件。对象
咱们能够这样设计:
咱们还能够这样设计:
以上两种方案均可以实现,但咱们仔细分析下,若是咱们再添加一个手机品牌呢和再添加一个软件呢?
若是是第一个方案设计的话,再添加一个软件的话,势必会修改原来的代码。
若是是第二个方案设计的话,再添加一个手机品牌的话,也会修改原来的代码。
并且无论哪一种方案,当扩展一个新的品牌或软件时,新增的类也很是的多,当时间愈来愈久,软件和品牌愈来愈多时,你会发现你会崩溃的。
咱们用M表明手机品牌,用N表明软件,这时候类的递增规律是呈(M*N+M)或(M*N+N)递增的。
接下来咱们就用桥接模式使得它呈M+N模式递增
HandsetSoft(手机软件)类——Implementor类
namespace BridgePattern.SituationSimulation { /// <summary> /// 手机软件抽象类 /// </summary> abstract class HandsetSoft { public abstract void Run(string name); } }
HandsetGame(手机游戏)类——ConcreteImplementorA类
namespace BridgePattern.SituationSimulation { /// <summary> /// 手机游戏类 /// </summary> class HandsetGame : HandsetSoft { public override void Run(string name) { Console.WriteLine($"{name}手机正在运行手机游戏"); } } }
HandsetAddressList(手机通信录)类——ConcreteImplementorB类
namespace BridgePattern.SituationSimulation { /// <summary> /// 手机通信录类 /// </summary> class HandsetAddressList : HandsetSoft { public override void Run(string name) { Console.WriteLine($"{name}手机正在运行手机通信录"); } } }
HandsetBrand(手机品牌)类——Abstraction类
namespace BridgePattern.SituationSimulation { /// <summary> /// 手机品牌类抽象类 /// </summary> abstract class HandsetBrand { protected HandsetSoft handsetSoft; public void SetHandsetBrand(HandsetSoft handsetSoft) { this.handsetSoft = handsetSoft; } public virtual void Run(string name) { handsetSoft.Run(name); } } }
Huawei(华为)类——RefinedAbstraction类
namespace BridgePattern.SituationSimulation { /// <summary> /// 华为手机 /// </summary> class Huawei : HandsetBrand { public override void Run(string name) { handsetSoft.Run(name); } } }
Xiaomi(小米)类——RefinedAbstraction类
namespace BridgePattern.SituationSimulation { /// <summary> /// 小米手机 /// </summary> class Xiaomi : HandsetBrand { public override void Run(string name) { handsetSoft.Run(name); } } }
客户端调用代码:
static void Main(string[] args) { try { {//SituationSimulation HandsetBrand huawei = new Huawei(); huawei.SetHandsetBrand(new HandsetGame()); huawei.Run("华为"); HandsetBrand xiaomi = new Xiaomi(); xiaomi.SetHandsetBrand(new HandsetGame()); xiaomi.Run("小米"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }
结果以下:
这样就能够实现(M+N)类递增模式了,还很好的知足了"开闭原则"。
在如下状况下可使用桥接模式: