大话设计之适配器模式

  喜欢看nba,没想到大鸟和小菜也这么喜欢看nba,在姚明的故事里衍生出一种新的模式——适配器模式

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

  由于姚明刚进入联盟不懂英语,所以教练布置的战术听不懂,需要给姚明找一个翻译,也就是适配器,在软件开发中,也就是系统的数据和行为都正确,但是接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用与希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。我们一起来看看下面的代码:

 class Program
    {
        static void Main(string[] args)
        {
            Player b = new Forwards("巴蒂尔");
            b.Attack();
            Player ym = new Translator ("姚明");
            ym.Attack();
            ym.Defense();
            Player m = new Guards("麦克格雷迪");
            m.Attack();
            Console.Read();
        }
    }
    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 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.防守();
        }
    }
  那么什么时候使用适配器模式呢?

  使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。也就是两个类所做的事情相同或者相似,但是具有不同的接口时。

   至于客户端统一调用同一接口就行了,这样应该可以更简单,直接,紧凑。

   关于适配器模式的.NET应用:

  在.NET中有一个类库已经实现的,非常重要的适配器,那就是DataAdapter。DataAdapter用作DataSet和数据源之间的适配器以便检索和保存数据。DataAdapter通过映射Fill(这更改了DataSet中的数据以便与数据源中的数据相匹配)和Update(这更改了数据源中的数据以便与DataSet中的数据相匹配)来提供这一匹配器。

  

  

posted @ 2014-05-19 20:23  PCLOVE1123  阅读(176)  评论(0编辑  收藏  举报