C#設計模式之介面卡模式

提高班14期郭倩_Ulrica發表於2018-06-03

前言

這就好比是一個轉接線一樣。能用原配儘量原配,實在不匹配再考慮用轉接線。

介面卡模式

英文:Adapter

what

將一個類的介面轉換成客戶希望的另外一個介面。使原本由於介面不相容而不能一起工作的那些類可以一起工作。、

現在有兩種介面卡型別:類介面卡模式和物件介面卡模式。
C#中不支援多重繼承,一個類只有一個父類,所以這裡主要講物件介面卡。

情景

姚明在國外打球,他和其他隊員都會打球,但是兩者卻說不一樣的語言,這時候,就要有個翻譯(介面卡)來幫助它們對接。(這裡,如果姚明很容易就學會英語,或者外國人很容易就學會中文,就不先考慮用翻譯)

我們們經常使用電腦轉介面,就是因為電腦插孔和顯示器不匹配,所以需要一個轉介面來將二者連線,這裡的轉接器就相當於介面卡。

應用

在軟體開發中,系統的資料和行為都正確,但介面不符,我們可以考慮用介面卡,目的是使控制範圍之外的一個原有物件與某個介面匹配。
介面卡模式主要應用於希望複用一些現存的類,但是介面又與複用環境要求不一致的情況。、

主要用與軟體開發後期或維護期。在介面不想通過時,首先不考慮介面卡,應該考慮重構統一介面。在雙方都不容易修改的時候再使用介面卡模式適配。

程式碼展示

球員類:

//球員抽象類

abstract class Player
{
    protected string name;
    public Player(string name)
    {
        this.name = name;
    }

    //進攻和防守的方法

    public abstract void Attack();
    public abstract void Defense();
}

具體衝鋒類:

//前鋒類
    class Forwards:Player 
    {
        public Forwards(string name): base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine("前鋒{0}進攻",name);
        }
        public override void Defense()
        {
            Console.WriteLine("前鋒{0}防守", name);
        }
    }

    //中鋒類
    class Center : Player
    {
        public Center (string name): base(name)
        {

        }
        public override void Attack()
        {
            Console.WriteLine("中鋒{0}進攻", name);
        }
        public override void Defense()
        {
            Console.WriteLine("中鋒{0}防守", name);
        }
    }


    //後衛類,同上↑

外籍中鋒類://不會說外文,需要翻譯(介面卡)

//外籍中鋒

    class ForeignCenter
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public void 進攻()    //外籍中鋒只懂得中文進攻
        {
            Console.WriteLine("外籍中鋒{0}進攻",name);
        }

        public void 防守()
        {
            Console.WriteLine("外籍中鋒{0}防守", name);
        }
    }

翻譯類:

class Translator:Player
{
private ForeignCenter yao = new ForeignCenter();

    public Translator(string name)
        : base(name)
    {
        yao.Name = name;
    }

    public override void Attack()
    {
        yao.進攻();
    }

    public override void Defense()
    {
        yao.防守(); 
    }

客戶端程式碼:

class Program
    {
        static void Main(string[] args)
        {
            Player cat = new Forwards("凱蒂貓");
            cat.Attack();

            Player dog = new Translator("阿拉斯加");
            dog.Attack();      //進攻
            dog.Defense();      //防守

            Console.Read();
        }
    }

效果圖:

介面卡

後記

相對於之前兩個模式來說,這個的程式碼更好理解,而且作用也一目瞭然。
但是希望我們做專案時儘量不會用到這個模式,因為感覺它就是用來當補丁的~~

相關文章