第17章 在NBA我需要翻譯----擴充卡模式
17.2 擴充卡模式
擴充卡模式Adapter,将一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不相容而不能一起工作的那些類一起工作。例如電源擴充卡。
在軟體開發中,有時會出現系統的資料和行為都正确,但接口不符時,我們應該考慮使用擴充卡,目的是是控制範圍之外的一個原有對象與某個接口比對。擴充卡模式主要應用于希望複用一些現存的類,但是接口又與複用環境要求不一緻的情況。
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();
}