【适配器模式】
适配器模式(Adapter)将一个类的接口转换成客户希望的另一个接口。adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作
【介绍】
-
主要解决:在软件系统中,常常要将一些“现存的现象”放到新的环境中,而新环境要求的接口是现对象不能满足的
-
何时使用:1、系统需要使用现有的类,而此类的接口不符合系统的需求。2、想要建立一个可以重复使用的类,用于一些彼此之间没有太大关系的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。3、通过接口转换,将一个类插入另一个类中
-
如何解决:继承或依赖
-
优点:1、可以让任何两个没有关联的类一起运行。2、提高了类的复用。3、增加了类的透明度。4、灵活性好
-
缺点:过多的使用适配器,会让系统非常零乱,不宜整体进行把握
-
使用场景:有动机地修改一个正常运行的系统接口,这时应该考虑使用适配器模式
-
注意事项:适配器不是在详细设计时添加的,而是解决增在服役的项目问题
【实现】
步骤一:球员类
abstract class Player
{
protected string name;
public Player (string name)
{
this.name = name;
}
public abstract void Attack();
public abstract void DefenseI();//进攻和防守
}
步骤二:前锋、中锋、后卫类
class Forwards : Player//前锋
{
public Forwards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("前锋{0} 进攻", name);
}
public override void DefenseI()
{
Console.WriteLine("前锋{0} 防守", name);
}
}
class Center:Player//中锋
{
public Center(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("中锋{0} 进攻", name);
}
public override void DefenseI()
{
Console.WriteLine("中锋{0} 防守", name);
}
}
class Guards:Player//后卫
{
public Guards(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine("后卫{0} 进攻", name);
}
public override void DefenseI()
{
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 wizf = new foreigncenter();
public translator(string name) : base(name)
{
wizf.name = name;
}
public override void attack()
{
wizf.进攻();
}
public override void defensei()
{
wizf.防守();
}
}
步骤五:客户端代码
static void Main(string[] args)
{
Player b = new Forwards("科比");
b.Attack();
Player m = new Guards("詹姆斯");
m.Attack();
Player y = new Translator ("姚明");
y.Attack();
y.DefenseI();
Console.Read();
}
【总结】