您的位置:首页 > 其它

2009-05-04读书记录:《大话设计模式》第十七章——适配器模式

2009-05-04 20:46 369 查看
昨天的外观模式让我想起了适配器,所以今天就跳过其它章节看了一下适配器模式。

适配器模式将一类的接口转成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

在软件开发中,系统的数据和行为正确,但接口不符时,我们应该考虑使用适配器,目的是使用控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于一些现存的类,但是接口与复用环境要求不一致的情况。

本章中使用姚明初到NBA打球时英语不流利为例讲解,例中翻译就是一个适配器,它将教练的话翻译为中文让姚明听的懂,又将姚明的话翻译成英文让教练听得懂(例程序中没有实现)。例子程序如下:

//抽象类:球员
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 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 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 ForeignCenter
{
public string name { get; set; }
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("麦迪");
m.Attack();
m.Defense();
player ym = new Translator("姚明");
ym.Attack();
ym.Defense();
Console.Read();
}


例子中无论后卫,前锋,中锋都继承自球员类,但外籍中锋则不行,因为姚明那个时候不懂英文!所以翻译继承球员类,在翻译类中引用姚明所在的外籍中锋类,而player类中要实现的防守及进入方法,翻译本身是不做的,而是告诉外籍球员的实例即姚明去做,所以在翻译类中复写的进攻和防守的方法都是由所引用的外籍中锋来完成的。(PS:一早就知道.NET支持中文的变量名和方法名,一直没使用过,这次竟然在这个例子中见到了!)

翻译的功能不止是将教练的话用中文解释给姚明听,还要将姚明的话翻译为英文给教练。要不然范甘迪(那个时候不是阿德尔曼)也不知道姚明是否已经理解了。但例子中没有给出这部分代码,因为C#不支持多重继承。理论上应该外籍球员也要有一抽象类,姚明继承,翻译同时继承球员及外籍球员两个类,这样才能互通。但此处不可行,具体有哪种模式可以解决,目前还不知道!:(
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐