GitHub代码
桥接模式
假设我们这有几电脑,信息如下:
品牌 | 系统 | 系统版本 |
---|---|---|
Dell | OS:Windows | Win10 |
MacBoox | MacOS | macOS 10.15 |
组装机 | Linux | Linux_CentOS release 6.5 |
我们定义一个抽象类来记录这些信息,并且用电脑看个电影玩个游戏:
using System;
namespace BridgePattern
{
public abstract class BaseInfo
{
//操作系统
public abstract string System();
//系统版本
public abstract string Version();
//玩游戏
public abstract void Game();
//看电影
public abstract void Movie();
}
}
使用3台电脑,都是去做玩游戏看电影的动作:
dell
using System;
namespace BridgePattern
{
public class Dell : BaseInfo
{
public override string System()
{
return "Windows";
}
public override string Version()
{
return "Win10";
}
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
}
}
MacBook
using System;
namespace BridgePattern
{
public class MacBook : BaseInfo
{
public override string System()
{
return "MacOS";
}
public override string Version()
{
return "macOS 10.15 ";
}
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
}
}
Customize
using System;
namespace BridgePattern
{
public class Customize : BaseInfo
{
public override string System()
{
return "Linux";
}
public override string Version()
{
return "CentOS release 6.5";
}
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
}
}
调用:
using System;
namespace BridgePattern
{
internal class Program
{
private static void Main(string[] args)
{
Dell dell = new Dell();
{
dell.Game();
dell.Movie();
dell.Version();
dell.System();
}
MacBook mac = new MacBook();
{
mac.Game();
mac.Movie();
mac.Version();
mac.System();
}
Customize custom = new Customize();
{
custom.Game();
custom.Movie();
custom.Version();
custom.System();
}
Console.ReadKey();
}
}
}
====================================================================
输出:
Brand:BridgePattern.Dell| OS:Windows-Win10
Brand:BridgePattern.Dell| OS:Windows-Win10
Brand:BridgePattern.MacBook| OS:MacOS-macOS 10.15
Brand:BridgePattern.MacBook| OS:MacOS-macOS 10.15
Brand:BridgePattern.Customize| OS:Linux-CentOS release 6.5
Brand:BridgePattern.Customize| OS:Linux-CentOS release 6.5
但是有一天我们要给Dell装Linux系统怎么做,继承?:
继承Dell的新类DellLinux:
using System;
namespace BridgePattern
{
public class DellLinux : Dell
{
public override string System()
{
return "Linux";
}
public override string Version()
{
return "CentOS release 6.5";
}
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), System(), Version());
}
}
}
那么问题来了,如果要给Mac装windows或linux系统呢,如果在加条显卡属性呢。不能每次都新建一个类吧。这时候使用桥接,就可以解决。
先看个图,百度的:
桥接模式意欲将抽象部分与实现部分分离,使它们都可以独立的变化。其实就是放弃继承方式产生对象。
简单但是不负责任的理解下就是:
新建类Computer(共用事件),存放使用信息(Movie/Game):
using System;
using BridgePattern.Bridge.System;
namespace BridgePattern.Bridge
{
public abstract class Computer
{
public abstract void Game();
public abstract void Movie();
public ISystem system { get; set; }
}
}
=======================================================================
Customize.cs
=======================================================================
using System;
namespace BridgePattern.Bridge
{
public class Customize : Computer
{
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
}
}
=======================================================================
Dell.cs
=======================================================================
using System;
namespace BridgePattern.Bridge
{
public class Dell: Computer
{
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
}
}
=======================================================================
MacBook.cs
=======================================================================
using System;
namespace BridgePattern.Bridge
{
public class MacBook: Computer
{
public override void Game()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
public override void Movie()
{
Console.WriteLine("Brand:{0}| OS:{1}-{2}", this.GetType(), system.System(), system.Version());
}
}
}
新建类ISystem(差异事件),存放系统信息(System/Version):
using System;
namespace BridgePattern.Bridge.System
{
public interface ISystem
{
string System();
string Version();
}
}
===============================================================
Linux.cs
=================================================================
using System;
namespace BridgePattern.Bridge.System
{
internal class Linux : ISystem
{
public string System()
{
return "Linux";
}
public string Version()
{
return "CentOS release 6.5";
}
}
}
===============================================================
macOS.cs
================================================================
using System;
namespace BridgePattern.Bridge.System
{
internal class macOS : ISystem
{
public string System()
{
return "MacOS";
}
public string Version()
{
return "macOS 10.15 ";
}
}
}
================================================================
window10.cs
================================================================
using System;
namespace BridgePattern.Bridge.System
{
internal class Window10 : ISystem
{
public string System()
{
return "Windows";
}
public string Version()
{
return "Win10";
}
}
}
调用:
using System;
using BridgePattern.Bridge;
using BridgePattern.Bridge.System;
namespace BridgePattern
{
internal class Program
{
private static void Main(string[] args)
{
ISystem macOs = new macOS();
ISystem window = new Window10();
ISystem linux = new Linux();
Computer Dell = new BridgePattern.Bridge.Dell();
{
Dell.system = linux;
Dell.Movie();
Dell.Game();
}
Computer Mac = new BridgePattern.Bridge.MacBook();
{
Mac.system = window;
Mac.Movie();
Mac.Game();
}
Console.ReadKey();
}
}
}
=======================================================================
输出:
Brand:BridgePattern.Bridge.Dell| OS:Linux-CentOS release 6.5
Brand:BridgePattern.Bridge.Dell| OS:Linux-CentOS release 6.5
Brand:BridgePattern.Bridge.MacBook| OS:Windows-Win10
Brand:BridgePattern.Bridge.MacBook| OS:Windows-Win10
我们可以对比,假定现在有4种不同系统,如果使用继承方法来实现,每次都需要创建一个类,复杂度为4*4,但是如果使用桥接只需要4+4。但是可以看出桥接模式增加了系统的复杂度。