例如我有好幾個項目,須要外包出去作各類類型的測試,不一樣的公司基礎費用不一樣,不一樣的測試類型價格也是不一樣的。此時不一樣的項目選擇不一樣的公司和不一樣類型的測試進行測試價格都是不一樣的。因而咱們能夠建立一個項目抽象類,一個公司抽象類,一個測試類型抽象類,而後實現各自的具體類,不一樣的項目使用不一樣的公司和測試類型,進行測試。抽象化與實現化解耦,兩者能夠獨立變化。咱們將這種經過提供抽象化和實現化之間的橋接結構,來實現兩者的解耦的類型稱爲橋接模式。編程
橋接(Bridge)是用於把抽象化與實現化解耦,使得兩者能夠獨立變化。這種類型的設計模式屬於結構型模式,它經過提供抽象化和實現化之間的橋接結構,來實現兩者的解耦。
這種模式涉及到一個做爲橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。設計模式
以引言中的示例進行實現。一個產品須要外包出去進行測試。測試
涉及三個角色:產品、外包公司、測試類型this
using System; namespace Bridge { class Program { static void Main(string[] args) { Company beijingCompany = new BeijingCompany(); TestType manualTest = new ManualTest(); Prodeuct managementProdeuct = new ManagementProdeuct(beijingCompany, manualTest); managementProdeuct.Run(); Company shanghaiCompany = new ShanghaiCompany(); TestType autoTest = new AutoTest(); Prodeuct operationProdeuct = new ManagementProdeuct(shanghaiCompany, autoTest); operationProdeuct.Run(); Console.Read(); } } /// <summary> /// 軟件產品,抽象類 /// 充當抽象化角色 /// 將抽象部分與實現部分分離,使他們均可以獨立的變化 /// </summary> public abstract class Prodeuct { private readonly Company _company; private readonly TestType _testType; // 使用組合,一個產品外包出去,須要一個公司進行不一樣測試類型的測試 public Prodeuct(Company company, TestType testType) { this._company = company; this._testType = testType; } public string Name { get; set; } // 執行實現部分 public void Run() { Console.WriteLine($"{this._company.Name}對產品{Name}進行{this._testType.Name},總共花費時間{this._company.BaseTime + this._testType.RunTime}。"); Console.WriteLine("======================================================"); } } /// <summary> /// 公司,對實現部分進行抽象 /// </summary> public abstract class Company { public string Name { get; set; } public Double BaseTime { get; set; } } /// <summary> /// 測試類型,對實現部分進行抽象 /// </summary> public abstract class TestType { public string Name { get; set; } public Double RunTime { get; set; } } /// <summary> /// 管理系統,擴展抽象化角色 /// </summary> public class ManagementProdeuct : Prodeuct { public ManagementProdeuct(Company company, TestType testType) : base(company, testType) { Name = "管理系統"; } } /// <summary> /// 運營系統,擴展抽象化角色 /// </summary> public class OperationProdeuct : Prodeuct { public OperationProdeuct(Company company, TestType testType) : base(company, testType) { Name = "運營系統"; } } /// <summary> /// 公司抽象類具體實現,具體實現化角色 /// </summary> public class BeijingCompany : Company { public BeijingCompany() { Name = "北京公司"; BaseTime = 200; } } /// <summary> /// 公司抽象類具體實現,具體實現化角色 /// </summary> public class ShanghaiCompany : Company { public ShanghaiCompany() { Name = "上海公司"; BaseTime = 100; } } /// <summary> ///測試類型抽象類具體實現,具體實現化角色 /// </summary> public class ManualTest : TestType { public ManualTest() { Name = "手工測試"; RunTime = 30; } } /// <summary> ///測試類型抽象類具體實現,具體實現化角色 /// </summary> public class AutoTest : TestType { public AutoTest() { Name = "自動測試"; RunTime = 10; } } }
運行後結果:spa
北京公司對產品管理系統進行手工測試,總共花費時間230。 ====================================================== 上海公司對產品管理系統進行自動測試,總共花費時間110。 ======================================================