17.1 在NBA我需要翻译!
17.2 适配器模式
Adapter,将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,
有些国家电压110v,而我国电压220v,笔记本电脑不是什么电压都能用的,所以有电源适配器这个东西,
系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但是接口与复用环境要求不一致的情况,
namespace 适配器模式 { class Program { static void Main(string[] args) { Target target = new Adapter(); //对客户端来说,调用的就是Target的Request方法, target.Request(); Console.Read(); } } //客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口, class Target { public virtual void Request() { Console.WriteLine("普通请求"); } } //需要适配的类, class Adaptee { public void SpecificRequest() { Console.WriteLine("特殊请求"); } } //通过在内部包装一个Adaptee对象,把源接口转换成目标接口, class Adapter : Target { private Adaptee adaptee = new Adaptee(); public override void Request() { adaptee.SpecificRequest(); //这样就可以把表面上调用Request方法变成实际上调用SpecificRequest方法, } } }
17.3 何时使用适配器模式
使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑适配器模式?对的,两个类所做的事情相同或相似,但是具有不同的接口时要使用它,而且由于类都共享同一个接口,客户代码可以统一调用同一接口就行了,这样可以更简单,更直接,更紧凑,
17.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.防守(); } } }
17.5 适配器模式的.NET应用
比如在.NET中有一个类库已经实现非常重要的适配器,那就是DataAdapter,DataAdapter用作与DataSet和数据源之间的适配器以便检索和保存数据,
17.6 扁鹊的医术