适配器模式
将一个类的接口转换成用户希望的另一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
当我们发现系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器,目的使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
//这是客户所期待的接口,目标可以是具体或抽象的类,也可以是接口
class Target
{
public virtual void Request()
{
Console.WriteLine("普通工作请求");
}
};
//需要适配的类
class Adaptee
{
public void SpecialRequest()
{
Console.WriteLine("特殊工作请求");
}
};
//Adapter,通过内部包装一个Adapter对象,把源接口转换成目标接口
class Adapter:Target
{
private Adaptee ad = new Adaptee();
public override void Request()
{
ad.SpecialRequest();
}
};
//客户端
void main()
{
Target t = new Adapter();
t.Request(); //这样一来,其实我们调用的是SpecialRequest
}
什么时候使用适配器模式呢?
当两个类所做的事情相同或者相似的时候,但是他们具备不同的接口,且双方都不太容易修改的时候,就要使用适配器模式
这样一来,客户端就可以同一调用接口。
以下为一个例子,讲一个异国篮球运动员听不懂教练的指挥,从而需要一个翻译(适配器)的例子:
//运动员抽象类
abstractclass Player
{
protected string name;
public Player(string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void Defense();
};
//本国运动员A
class PlayerA :Player
{
public PlayerA(string name) :base(name)
{}
public override void Attack()
{
Console.WriteLine("攻击,{0}",name);
}
public override void Defense()
{
Console.WriteLine("防守,{0}",name);
}
};
//异国运动员B
class ForeignPlayer
{
private string name;
public string Name
{
get{ return name; }
set{ name = value; }
}
public void AK()
{
Console.WriteLine("Attack{0}",name;
}
public void DF()
{
Console.WriteLine("Defend{0}",name);
}
};
//异国运动员的翻译
class Translator : Player
{
private ForeignPlayer FP = new ForeignPlayer();
public Translator(string name) :base(name)
{
FP.Name = name;
}
public override void Attack()
{
FP.AK();
}
public override void Denfense()
{
FP.DF();
}
};
void main()
{
//当我们要指挥异国运动员时候,我们指挥翻译员
Player fp = new Translator("ABC");
fp.Attack();
fp.Defense();
}