一個軟件團隊開發繪圖系統,設計了圓對象(Circle)、矩形對象(Rectangle),線對象(Line)。都支持Draw()函數,便可以經過Draw()函數繪製圖形。咱們應該如何作呢?app
namespace Adapter { class Program { static void Main(string[] args) { Circle circle = new Circle(); Rectangle rect = new Rectangle(); Line line = new Line(); test(circle); test(rect); test(line); Console.ReadKey(); } static void test(IDrawPic drawpic) { drawpic.draw(); } } interface IDrawPic { void draw(); } class Circle : IDrawPic { public void draw() { Console.WriteLine("我畫了一個圓"); } } class Rectangle : IDrawPic { public void draw() { Console.WriteLine("我畫了一個矩形"); } } class Line : IDrawPic { public void draw() { Console.WriteLine("我畫了一條線"); } } }
那麼如今,爲了加快項目進度,將角度對象(Angle)繪製功能交給了合做團隊實現。咱們又該怎麼作呢?從新定義一個Angle類,而後將角度對象繪製函數定爲DrawAngle()?這樣合理嗎?函數
容易想到的是,繪圖系統提供給用戶後,用戶不滿意,但願能統一的調用,不用記太多命令。這裏就要用到咱們今天要說的適配器模式了。this
namespace Adapter { class Program { static void Main(string[] args) { Circle circle = new Circle(); Rectangle rect = new Rectangle(); Line line = new Line(); Angle ang = new Angle(); IDrawPic drawpic = new AdapterAngle(ang); test(circle); test(rect); test(line); test(drawpic); Console.ReadKey(); } static void test(IDrawPic drawpic) { drawpic.draw(); } } interface IDrawPic { void draw(); } class AdapterAngle : IDrawPic { Angle angle; public AdapterAngle(Angle angle) { this.angle =angle; } public void draw() { angle.DrawAn(); } } class Angle { public void DrawAn() { Console.WriteLine("我畫了一個角"); } } class Circle : IDrawPic { public void draw() { Console.WriteLine("我畫了一個圓"); } } class Rectangle : IDrawPic { public void draw() { Console.WriteLine("我畫了一個矩形"); } } class Line : IDrawPic { public void draw() { Console.WriteLine("我畫了一條線"); } } }
適配器模式的優勢是,一般來講,客戶端經過類的接口訪問它提供的服務。有時候現有的類能夠提供客戶端的功能須要,可是它所提供的接口不必定是客戶端所但願的。這就須要一個適配器,將類提供的接口轉換成客戶端須要的接口。這樣保證了對現有類的重用。這就是適配器類。spa
UML圖:設計
一、適配器模式(Adapter Pattern): 將一個接口轉換成客戶但願的另外一個接口,適配器模式使接口不兼容的那些類能夠一塊兒工做,其別名爲包裝器(Wrapper)。適配器模式既能夠做爲類結構型模式,也能夠做爲對象結構型模式。code
二、該模式的優勢:對象
§將目標類和適配者類解耦,經過引入一個適配器類來重用現有的適配者類,而無須修改原有代碼。接口
§增長了類的透明性和複用性,將具體的實現封裝在適配者類中,對於客戶端類來講是透明的,並且提升了適配者的複用性。ci
§靈活性和擴展性都很是好,經過使用配置文件,能夠很方便地更換適配器,也能夠在不修改原有代碼的基礎上增長新的適配器類,徹底符合「開閉原則」。開發
二、模式使用情景:
§系統須要使用的類的接口不符合系統的要求。
§想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。這些源類不必定有很複雜的接口。
§(對象適配器而言)在設計裏,須要改變多個已有子類的接口,若是使用類的適配器模式,就要針對每個子類作一個適配器,而這不太實際。
一、結構型模式:描述如何將類或者對象結合在一塊兒造成更大的結構。結構模式描述兩種不一樣的東西:類與類的實例(即對象)。 根據這一點,結構模式能夠分爲類的結構模式和對象的結構模式。