桥接模式简介
将抽象和实现解耦,使得两者可以独立的变化。
在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。实现系统可能有多个角度分类,每一种角度都可能变化。把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
C# 桥接模式Demo
静态继承UML:
组合桥接模式:
using System;
using System.Collections.Generic;
namespace BridgePattern
{
class Program
{
static void Main(string[] args)
{
PhoneBrand huaweiPhone = new Huawei();
huaweiPhone.SetSoft(new WeiXin());
huaweiPhone.Run();
huaweiPhone.SetSoft(new Game());
huaweiPhone.Run();
PhoneBrand xiaoMiPhone = new XiaoMi();
xiaoMiPhone.SetSoft(new Game());
xiaoMiPhone.Run();
}
}
/// <summary>
/// 品牌
/// </summary>
public abstract class PhoneBrand
{
protected Software software = null;
public void SetSoft(Software software)
{
this.software = software;
}
public abstract void Run();
}
/// <summary>
/// 软件 品牌与软件解耦
/// </summary>
public abstract class Software
{
public abstract void Run();
}
public class Huawei : PhoneBrand
{
public override void Run()
{
Console.WriteLine("using Huawei Phone");
this.software.Run();
}
}
public class XiaoMi : PhoneBrand
{
public override void Run()
{
Console.WriteLine("using XiaoMi Phone");
this.software.Run();
}
}
public class WeiXin : Software
{
public override void Run()
{
Console.WriteLine("Running WeiXin software");
}
}
public class Game : Software
{
public override void Run()
{
Console.WriteLine("Running Game software");
}
}
}
测试结果:
由上例可知:静态继承的方式,若新添品牌或新添软件,类的数量 = 品牌数*软件数,会导致继承类的膨胀;而组合桥接, 类的数量 = 品牌数+软件数。
总结: 对于两个独立变化的维度,首先考虑使用桥接模式! | |
---|---|
参考资料
- https://www.runoob.com/design-pattern/bridge-pattern.html
- https://www.bilibili.com/video/av78515440?t=1985&p=18
- 更多: