什么是适配器模式?
将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
什么时候使用?
1、使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式
2、客户统一调用同一接口,可以更简单、更直接、更紧凑
3、双方都不容易修改的时候再使用适配器模式适配
结构图
例子:姚明再国外参加篮球训练,开始他是听不懂国外选手说话的,但是又不能不沟通,所以姚明就需要一个翻译,这个翻译就是适配器
球场要做的进攻还是防守以及各个球员是谁
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); } #endregion }
外籍中锋(姚明)
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.防守(); } }
客户端
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(); }