设计模式- 适配器模式

 适配器模式分为两种,一种是对象的适配器模式,另一种是类的适配器模式。我们知道C#是单继承的,C++是多继承的。类的适配器适合用于多继承的,所以这篇文章就只讲对象的适配器。

我们先来理解一下什么是适配器模式?

1、在我们的生活中其实经常需要用到适配器模式的地方,例如我们的手机充电器,我们知道我国的电源电压是220V的,但是手机电池能接受的电压是3-7V,为了使得手机电池能接受220V的电源电压,需要一个变压器,把220V电压转成3-7V的电压,那么这个变压器我们就可以理解成是一个适配器。(将不适合的电压变成适合手机电池的电压

设计模式- 适配器模式

(手机充电器)

 

2、再举个例子,春晓家里有三个房间,一开始这三个房间都是睡房,有一天他想把家里的一个房间从睡房变成书房。那么你会怎么改变睡房? 把里面的东西搬光光吗?还是在原有的基础上作进一步改进?我们大多都会选择后者,这也是适配器模式里的一个要点,在原有的类的基础上作一些调整变成一个新的类。我们改变的过程,是把睡房里面不适合于书房的东西搬出来,把书房需要的东西搬进去,之后进行整理,就变成了我们想要的书房。

 

设计模式- 适配器模式

(睡房变书房后)

通过上面两个例子我相信你对适配器模式有了一定的认识。关键只是捉住两点,第一点是适配器模式是建立在已有类的基础上。第二点是使用已有类的方法和属性,构造出我们需要的新的类。

这么一讲我猜,你可能会觉的我们平时在做编程的时候不是经常用到适配器模式吗?是的,我们经常用到,只是一直都没有意识到这就是适配器模式!

 

  代码实现

最后我们通过一小段C#代码来加深一下理解,我用到已有类ArrayList作一些改进,变成一个栈类,栈的特性是先进后出,我们简单的实现他先进后出就行,其他的就不实现了:

View Code
namespace 适配器模式

{

    class Program

    {

        static void Main(string[] args)

        {

            IStack stack = new AdapterStack();

            stack.Push(1);

            stack.Push("Cx");

            stack.Push("zz");

            stack.Push("kk");



            Console.WriteLine(stack.Pop());

            Console.WriteLine(stack.Pop());



            Console.ReadLine();

        }

    }



    interface IStack

    {

        void Push(object item);

        object Pop();

    }



    class AdapterStack : IStack

    {

        ArrayList adaptee;

        public AdapterStack()

        {

            adaptee = new ArrayList();

        }

        /// <summary>

        /// 入栈

        /// </summary>

        public void Push(object item)

        {

            adaptee.Add(item);

        }



        /// <summary>

        /// 出栈

        /// </summary>

        public object Pop()

        {

            object o = adaptee[adaptee.Count - 1];

            adaptee.RemoveAt(adaptee.Count - 1);

            return o;

        }



    }

}

大话设计模式里适配器模式的代码:

View Code
using System;

using System.Collections.Generic;

using System.Text;



namespace 适配器模式

{

    class Program

    {

        static void Main(string[] args)

        {

            Player b = new Forwards("巴蒂尔");

            b.Attack();



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

            m.Attack();



            //Player ym = new Center("姚明");

            Player ym = new Translator("姚明");

            ym.Attack();

            ym.Defense();



            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 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 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.防守();

        }

    }

}

 

  最后PS下:这篇文章参看了微软的设计模式教程和《大话设计模式》。只有少部份文字是自己对适配器的理解。

 

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