1,定義
適配器模式(Adapter),將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本接口不兼容而不能一起工作的類可以一起工作
2,UML圖
適配器模式
3,基本代碼
namespace 適配器模式
{
class Program
{
static void Main(string[] args)
{
Target target = new Adapter();
target.Request();
Console.Read();
}
}
class Target
{
public virtual void Request()
{
Console.WriteLine("普通請求");
}
}
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊請求");
}
}
class Adapter : Target
{
private Adaptee adaptee = new Adaptee();
public override void Request()
{
adaptee.SpecificRequest();
}
}
}
4,簡單應用
namespace 適配器模式
{
class Program
{
static void Main(string[] args)
{
Player b = new Forwards("巴蒂爾");
b.Attack();
Player m = new Guards("麥克格雷迪");
m.Attack();
//Player ym = new Center("姚明");
Player ym = new Translator("姚明");
ym.Attack();
ym.Defense();
Console.Read();
}
}
//籃球運動員
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 Guards : Player
{
public Guards(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 wjzf = new ForeignCenter();
public Translator(string name)
: base(name)
{
wjzf.Name = name;
}
public override void Attack()
{
wjzf.進攻();
}
public override void Defense()
{
wjzf.防守();
}
}
}
5,思考
1,應用于希望復用現存的類,但是接口不一致
2,遇到接口不一致的情況,首先應該通過重構,只有在雙方不太容易修改的時候或者無法改變原有的設計和代碼的情況下才用適配器模式適配