適配器模式——結構型模式

思路:

一個軟件團隊開發繪圖系統,設計了圓對象(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

    §靈活性和擴展性都很是好,經過使用配置文件,能夠很方便地更換適配器,也能夠在不修改原有代碼的基礎上增長新的適配器類,徹底符合「開閉原則」。開發

二、模式使用情景:

    §系統須要使用的類的接口不符合系統的要求。

    §想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。這些源類不必定有很複雜的接口。

    §(對象適配器而言)在設計裏,須要改變多個已有子類的接口,若是使用類的適配器模式,就要針對每個子類作一個適配器,而這不太實際。

本菜鳥的疑難雜症:

一、結構型模式:描述如何將類或者對象結合在一塊兒造成更大的結構。結構模式描述兩種不一樣的東西:類與類的實例(即對象)。 根據這一點,結構模式能夠分爲類的結構模式和對象的結構模式。

相關文章
相關標籤/搜索