设计模式——适配器模式(NBA里有翻译)

来源:互联网 发布:淘宝热销品牌排行榜 编辑:程序博客网 时间:2024/06/05 12:26

       目的:接口不符时,控制范围之外的一个原有对象与某个接口匹配。主要应用于希望复用一些现存的类,但是接口又与复用环境不一致的情况。

Adapter结构图:

实现功能:

结构图:

又与姚明刚到NBA,只能实现 进攻() 和防守()  ,而无法实现Attck() 和 Defense,因此此时就需要Translator充当适配器,继承Play抽象类了。

具体实现代码:

namespace _13适配器{    class Program    {        static void Main(string[] args)        {            Player fw = new Forwards("巴蒂尔");            fw.Attack();            Player gd = new Guards("麦克格雷迪");            gd.Attack();            Player ym = new Translator("姚明");          //避免与wjzf发生关系            ym.Attack();            ym.Defense();            Console.ReadKey();        }    }    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 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 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);        }    }}

       此模式虽然存在其实用性,但是乱用倒不如不用。“事先预防接口不同的问题,不匹配问题就不会发生;在有小的接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有设计和代码的情况时,才考虑适配。”

        魏文王之问扁鹊耶?曰:‘子昆弟三人其孰最善为医?’扁鹊曰:‘长兄最善,中兄次之,扁鹊最为下。’魏文侯曰:‘可得闻邪?’扁鹊曰:‘长兄于病视神,未有形而除之,故名不出于家。中兄治病,其在毫毛,故名不出于闾。若扁鹊者,镵血脉,投毒药,副肌肤,闲而名出闻于诸侯。’

                                                                                                                                                                                                           ——《鹖冠子》---世贤第十六

 


 

 

 

原创粉丝点击