天天看點

大話設計模式-第17章 在NBA我需要翻譯----擴充卡模式

第17章 在NBA我需要翻譯----擴充卡模式

17.2 擴充卡模式

    擴充卡模式Adapter,将一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不相容而不能一起工作的那些類一起工作。例如電源擴充卡。

    在軟體開發中,有時會出現系統的資料和行為都正确,但接口不符時,我們應該考慮使用擴充卡,目的是是控制範圍之外的一個原有對象與某個接口比對。擴充卡模式主要應用于希望複用一些現存的類,但是接口又與複用環境要求不一緻的情況。

大話設計模式-第17章 在NBA我需要翻譯----擴充卡模式

Target:使用者希望的接口。目标可以是具體的或抽象的類,也可以是接口

class Target

{

    public virtual void Request()

    {

        Console.WriteLine(“普通請求!使用者希望的接口。”);

    }

}

Adaptee(需要适配的類)代碼如下:

class Adaptee

{

    public void SpecificRequest

    {

        Console.WriteLine(“特殊請求!需要配适配得類。”);

    }

}

Adapter(通過在内部包含一個Adaptee對象,把原接口轉換成目标接口)代碼如下:

class Adapter : Target

{

    private Adaptee adapter = new Adaptee();

    public override void Request()

    {

        adaptee.SpecificRequest();

    }

}

用戶端代碼:

static void Main(string[] args)

{

    Target target = new Adapter();

    target.Request();

    Console.Read();

}

17.3 何時使用擴充卡模式

    如果想使用一個已經存在的類,如果他的接口,也就是它的方法和你的要求不相同時,就應該考慮使用擴充卡模式。

兩個類所做的事情相同或相似,但是具有不同的接口時要使用它。

    客戶代碼可以統一調用同一接口,可以更簡單,更直接,更緊湊。

    還有就是在開發時,合并代碼是,如果多方都不太容易修改的時候再使用擴充卡模式适配,但不要一有不同的時候就是用它。

再有,若公司打算使用第三方元件時,這個元件的接口與我們自己的系統接口不相同時,而我們完全沒有必要為了迎合它而改動自己的接口。

17.4 籃球翻譯擴充卡

//球員

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

{

    //與前鋒代碼類似,略

}

//後衛

class Guards : Player

{

    //與前鋒代碼類似,略

}

用戶端代碼

static void Main(string[] args)

{

    Player b = new Forwards(“巴蒂爾”);

    b.Attack();

    Player m = new Guards(“YYY”);

    m.Attack();

    player ym = new Center(“姚明”);

    ym.Attack();

    ym.Defense();//注意此處姚明應該無法響應這些消息。

    Console.Read();

}

現添加外籍中鋒類

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 wjzf = new ForeignCenter();

    public Translator(string name) : base(name)

    {

        wjzf.Name = name;

    }

    public override void Attack()

    {

        wjzf.進攻();

    }

    public override void Defense()

    {

        wjzf.防守();

    }

}

用戶端代碼:

static void Main(string[] args)

{

    Player b = new Forwards(“巴蒂爾”);

    b.Attack();

    Player m = new Guards(“YYY”);

    m.Attack();

    player ym = new Translator(“姚明”);

    ym.Attack();

    ym.Defense();//注意此處姚明應該無法響應這些消息。

    Console.Read();

}

大話設計模式-第17章 在NBA我需要翻譯----擴充卡模式

繼續閱讀