适配器模式(Adapter)定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景:
- 复用一些现存的类,但接口又于复用环境不一致
- 双方都不太容易修改的时候
代码背景: 姚明去美国打NBA,但是不会英语无法和教练球员沟通,翻译就起到了适配器的作用。
球员类:
abstract class Player { protected string name; public Player(string name) { this.name = name; } public abstract void Attack();//进攻 public abstract void Defense();//防守 }
前锋:用英语沟通战术,姚明不知道Attack()和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 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()//翻译者将Attack翻译为进攻,告诉了外籍中锋 { wjzf.进攻(); } public override void Defense()//翻译者将Defens翻译为防守,告诉了外籍中锋 { wjzf.防守(); } }
客户端:
static void Main(string[] args) { Player b = new Forwards("巴蒂尔"); b.Attack(); b.Defense(); Player ym = new Translator("姚明"); ym.Attack(); ym.Defense(); Console.ReadKey(); }