设计模式之适配器模式

定义:

  适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

结构图:

设计模式之适配器模式_第1张图片

例子:

  背景:姚明刚来到NBA,他球技很好,但是不懂英语,不能立马学会英语,目前最好的解决办法就需要一个翻译者类来‘适配’。

代码:
//球员
    abstract class Player
    {
        protected string name;
        public Player(string name)
        {
            this.name = name;
        }

        public abstract void Attact();//进攻方法
        public abstract void Defense();//防守方法
    }

//后卫
    class Guards:Player 
    {
        public Guards(string name)
            : base(name)
        {
        }
        public override void Attact()
        {
            Console.WriteLine("后卫 {0} 进攻", name);
        }

        public override void Defense()
        {
            Console.WriteLine("后卫 {0} 防守", name);
        }
    }

 //前锋
    class Forwards:Player 
    {
        public Forwards(string name)
            : base(name)
        {
        }
        public override void Attact()
        {
            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 Attact()//翻译者将‘Attact’翻译为‘进攻’告诉外籍中锋
        {
            wjzf .进攻 ();
        }

        public override void Defense()//翻译者将‘Defense’翻译为‘防守’告诉外籍中锋

        {
            wjzf .防守 ();
        }
    }

客户端代码:
 Player b = new Forwards("巴蒂尔");
            b.Attact();

            Player m = new Guards("麦克格雷迪");
            m.Attact();

            Player ym = new Translator("姚明");
            ym.Attact();
            ym.Defense();

            Console.Read();

总结:

  适配器模式很好用但是只有碰到无法改变原有设计和代码的情况时,才考虑适配。事后控制不如事中控制,事中控制不如事前控制。希望能够使这个模式使用的恰到好处!


你可能感兴趣的:(设计模式,适配器)