清晰架構原則對於任何希望創建健壯、可維護和可擴展軟體的軟體開發者來說都至關重要。理解並實施這些概念可以顯著提升你的編程技能。以下是對20個基本架構洞見的深入探討:依賴規則: 清晰架構的核心是依賴規則。它規定源代碼的依賴關係應始終指向內部。這種內向的方向確保了一個具有彈性的基礎,強調了關註點的分離,並 ...
基礎介紹:
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。適用於不希望在抽象和實現部分之間有固定的綁定關係的情況,或者類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充的情況。
將抽象部分與實現部分分離,使它們都可以獨立地變化。
其實兩個都是抽象的部分,更準確的說,是將一個事物中多個維度的變化分離。
比如不用軟體運行在不同的操作系統上。
操作系統是一個維度,分為ios、Android、Windows等。
軟體系統是一個維度,分別為微信、QQ、酷狗音樂等。
一個維度可以認為是抽象部分,另一個維度可以認為是實現部分,而這兩個維度可以獨立擴充和維護。
單獨看起來比較複雜和難以理解,可以先大致看下基礎結構,然後結合以下實例來解讀。
橋接模式的結構:
Abstraction:定義抽象類的介面,一般為抽象類,規範RefinedAbstraction,並創建一個Implementor實例。主要靠這個類來進行橋接。
RefinedAbstraction:Abstraction的子類,具體實現Abstraction里規定的方法。
Implementor:定義實現類的介面,一般情況,Implementor介面僅為提供基本操作,而Abstraction則定義了基於基本操作的較高層次操作。
ConcreteImplementor:Implementor的子類,具體實現Implementor介面 。
在橋接模式中,兩個類Abstraction和Implementor分別定義了抽象與行為類型的介面,通過調用子類實現抽象與行為的動態組合。
應用場景:
適用於不希望在抽象和實現部分之間有固定的綁定關係的情況,或者類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充的情況。
創建方式:
橋接模式的實現方式是通過在抽象類中持有一個指向實現類的引用,從而將抽象類與實現類解耦。
通常情況下,抽象類和實現類都需要定義自己的介面,以便彼此之間進行通信。
實例一:不用軟體運行在不同的操作系統上。
操作系統是一個維度,分為ios、Android、Windows等。
軟體系統是一個維度,分別為微信、QQ、酷狗音樂等。
這兩個維度可以獨立擴充和維護,一個維度可以認為是抽象部分,另一個維度可以認為是實現部分。
實現部分中的介面(Implementor)只需提供基本操作,抽象部分中的介面(Abstraction)來創建一個實現介面(Implementor)實例,用這個實例將兩部分緊密連續在一起。
抽象部分也是基於這個實例才做一些較高層次的操作。
在這裡可以把操作系統當做抽象部分,把軟體系統當做實現部分。
在抽象部分中創建一個抽象類(Abstraction),該類中創建一個軟體系統的實例,即實現類的實例(Implementor),並規定抽象部分具體實現類(RefinedAbstraction)要實現哪些方法。
註:抽象類和介面主要起橋梁作用和規範作用(Abstraction和Implementor),其具體實現都在其子類中(RefinedAbstraction和ConcreteImplementor)。
在實現部分中創建一個介面(Implementor),該介面主要規範實現類(ConcreteImplementor)需要實現的方法。
RefinedAbstraction和ConcreteImplementor分別繼承自Abstraction和Implementor,並實現其規定的方法。
即:
Abstraction ---》操作系統抽象類
RefinedAbstraction---》ios、Android、Windows等具體實現
Implementor----》軟體介面類
ConcreteImplementor---》微信、QQ、酷狗音樂等具體實現
1、軟體介面類
1 /// <summary> 2 /// 軟體介面類 3 /// </summary> 4 public interface ISoftWare 5 { 6 /// <summary> 7 /// 定義一個軟體啟動方法 8 /// </summary> 9 void Start(); 10 }
Implementor-實現類介面,只聲明最基本的方法。
2、軟體實現類
1 /// <summary> 2 /// 微信 3 /// </summary> 4 public class WeChat : ISoftWare 5 { 6 public void Start() 7 { 8 Console.WriteLine("啟動微信"); 9 } 10 } 11 12 /// <summary> 13 /// QQ 14 /// </summary> 15 public class TencentQQ : ISoftWare 16 { 17 public void Start() 18 { 19 Console.WriteLine("啟動QQ"); 20 } 21 }
ConcreteImplementor-繼承自實現類介面,實現其基本方法。
3、系統抽象類
1 /// <summary> 2 /// 系統抽象類(橋接類) 3 /// </summary> 4 public abstract class SystemPlatform 5 { 6 //創建軟體類實例 7 public ISoftWare _softWare; 8 9 //通過構造函數註入具體軟體實例 10 public SystemPlatform(ISoftWare softWare) 11 { 12 this._softWare = softWare; 13 } 14 15 //執行軟體運行 16 public abstract void Run(); 17 }
Abstraction-操作系統抽象類,創建一個實現類實例,用來訪問實現類內的操作。
該類為實際的橋接類,其他還規範了更高一層的方法。
4、系統平臺實現類
1 /// <summary> 2 /// ios系統 3 /// </summary> 4 public class IosSys : SystemPlatform 5 { 6 public IosSys(ISoftWare softWare) 7 : base(softWare) 8 { 9 Console.WriteLine("進入IOS系統"); 10 } 11 public override void Run() 12 { 13 _softWare.Start(); 14 } 15 } 16 17 /// <summary> 18 /// Android系統 19 /// </summary> 20 public class AndroidSys : SystemPlatform 21 { 22 public AndroidSys(ISoftWare softWare) 23 : base(softWare) 24 { 25 Console.WriteLine("進入Android系統"); 26 } 27 public override void Run() 28 { 29 _softWare.Start(); 30 } 31 }
RefinedAbstraction-系統抽象具體實現類,實現了各個實際功能。
5、客戶端
1 /// <summary> 2 /// 客戶端 3 /// </summary> 4 class Client 5 { 6 static void Main(string[] args) 7 { 8 //創建軟體對象 9 WeChat weChat = new WeChat(); 10 TencentQQ tencentQQ = new TencentQQ(); 11 12 //創建操作系統並安裝軟體 13 SystemPlatform systemPlatform = new IosSys(weChat); 14 systemPlatform.Run(); 15 16 systemPlatform = new AndroidSys(tencentQQ); 17 systemPlatform.Run(); 18 19 Console.ReadKey(); 20 } 21 }
這隻是一個簡單的實例,如果一個系統中預裝載多個軟體,可以將構造函數改為集合參數或者申明其他公開方法進行預安裝。
實例二:不同形狀的物體賦予不同顏色。
不同形狀的物體是一個維度,分別為長方形、矩形、圓形等。
不同顏色是一個維度,分別為白色、黑色、紅色等。
即:
Abstraction ---》形狀抽象類
RefinedAbstraction---》方形 圓形等具體實現
Implementor----》顏色介面類
ConcreteImplementor---》白色 黑色等具體實現
1、顏色介面類
1 public interface Color 2 { 3 void Bepaint(); 4 }
規範顏色實現類,並供形狀抽象類使用和維護。
2、顏色實現類
1 public class White : Color 2 { 3 public void Bepaint() 4 { 5 Console.WriteLine("白色的"); 6 } 7 } 8 9 public class Gray : Color 10 { 11 public void Bepaint() 12 { 13 Console.WriteLine("灰色的"); 14 } 15 } 16 17 public class Black : Color 18 { 19 public void Bepaint() 20 { 21 Console.WriteLine("黑色的"); 22 } 23 }
3、形狀抽象類
1 public abstract class Shape 2 { 3 public Color color; 4 public void SetColor(Color color) 5 { 6 this.color = color; 7 } 8 public abstract void Draw(); 9 }
創建顏色實例供實現類使用,並規範實現類。
這個類主要是將形狀和顏色兩個維度的東西聯繫在一起,並制定高一級的操作規範。
4、形狀實現類
1 public class Circle : Shape 2 { 3 public override void Draw() 4 { 5 color.Bepaint(); 6 Console.WriteLine("圓形"); 7 } 8 } 9 public class Rectangle : Shape 10 { 11 12 public override void Draw() 13 { 14 color.Bepaint(); 15 Console.WriteLine("長方形"); 16 } 17 } 18 public class Square : Shape 19 { 20 public override void Draw() 21 { 22 color.Bepaint(); 23 Console.WriteLine("正方形"); 24 } 25 }
具體實現類
5、客戶端
1 class Client 2 { 3 static void Main(string[] args) 4 { 5 //白色 6 Color white = new White(); 7 //正方形 8 Shape square = new Square(); 9 //白色的正方形 10 square.SetColor(white); 11 square.Draw(); 12 13 //長方形 14 Shape rectange = new Rectangle(); 15 rectange.SetColor(white); 16 rectange.Draw(); 17 18 Console.ReadKey(); 19 } 20 }
其實顏色和形狀兩個維度的東西,各自維護和發展並不互相影響。
使用的時候也是將一個維度的東西加裝的另一個維度上去,搭建一個橋梁供另一個維度去使用。
至於怎麼載入就無所謂了,可以在構造函數中指定,也可以在方法參數中傳遞。
總結:
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
橋接模式的實現方式是通過在抽象類中持有一個指向實現類的引用,從而將抽象類與實現類解耦。
通常情況下,抽象類和實現類都需要定義自己的介面,以便彼此之間進行通信。
作者:少年真愛 出處:https://www.cnblogs.com/mingnianjiehunba/p/17732881.html 博主的文章沒有高度、深度和廣度,只是湊字數。由於博主的水平不高,不足和錯誤之處在所難免,希望大家能夠批評指出。 博主是利用讀書、參考、引用、抄襲、複製和粘貼等多種方式打造成自己的文章,請原諒博主成為一個無恥的文檔搬運工!