简介
适配器模式,将一个类的接口转换成客户希望的另外一个接口。对象适配器模式——在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
书中实例
小菜难得能和大鸟一起看NBA直播,球赛完了,小菜还陶醉在火箭队今年能怎样怎样,大鸟却又开始出题了。姚明是美国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 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.防守(); } }
//客户端 class Program { static void Main(string[] args) { Player b = new Forwards("巴蒂尔"); b.Attack(); Player m = new Guards("麦克格雷迪"); m.Attack(); Player ym = new Translator("姚明"); ym.Attack(); ym.Defense(); Console.Read(); } }
组成类图
关系介绍
目标类(Target)是适配器类(Adapter)的父类。适配器类和需要适配的类(Adaptee)具有关联关系适配器模式的构成
Target(目标类):这是客户所期待的接口。目标可以是具体或抽象的类,也可以是接口。
Adaptee(需要适配的类):即上述代码中外籍外援的类
Adapter(适配器类):通过在内部包装一个Adapte对象,把源接口转换成目标接口
适配器模式的优点
1.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景
1.两个类所做的事情相同或类似,但是具有不同的接口时要使用适配器模式
2.在双方都不太容易修改的时候再使用适配器模式适配