【设计模式】——适配器模式

【适配器模式】

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

 

【介绍】

  • 主要解决:在软件系统中,常常要将一些“现存的现象”放到新的环境中,而新环境要求的接口是现对象不能满足的

  • 何时使用:1、系统需要使用现有的类,而此类的接口不符合系统的需求。2、想要建立一个可以重复使用的类,用于一些彼此之间没有太大关系的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。3、通过接口转换,将一个类插入另一个类中

  • 如何解决:继承或依赖

  • 优点:1、可以让任何两个没有关联的类一起运行。2、提高了类的复用。3、增加了类的透明度。4、灵活性好

  • 缺点:过多的使用适配器,会让系统非常零乱,不宜整体进行把握

  • 使用场景:有动机地修改一个正常运行的系统接口,这时应该考虑使用适配器模式

  • 注意事项:适配器不是在详细设计时添加的,而是解决增在服役的项目问题

 

【实现】

 

【设计模式】——适配器模式

步骤一:球员类

 abstract class Player

    {

        protected string name;

        public Player (string name)

        {

            this.name = name;

        }

        public abstract void Attack();

        public abstract void DefenseI();//进攻和防守

    }

 

步骤二:前锋、中锋、后卫类


 

class Forwards : Player//前锋

    {

        public Forwards(string name) : base(name)

        {



        }

        public override void Attack()

        {

            Console.WriteLine("前锋{0}  进攻", name);

        }

        public override void DefenseI()

        {

            Console.WriteLine("前锋{0}  防守", name);

        }

    }

   

    class Center:Player//中锋

    {

        public Center(string name) : base(name)

        {



        }

        public override void Attack()

        {

            Console.WriteLine("中锋{0}  进攻", name);

        }

        public override void DefenseI()

        {

            Console.WriteLine("中锋{0}  防守", name);

        }

    }

    class Guards:Player//后卫

    {

        public Guards(string name) : base(name)

        {



        }

        public override void Attack()

        {

            Console.WriteLine("后卫{0}  进攻", name);

        }

        public override void DefenseI()

        {

            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 wizf = new foreigncenter();

        public translator(string name) : base(name)

        {

            wizf.name = name;

        }

        public override void attack()

        {

            wizf.进攻();

        }

        public override void defensei()

        {

            wizf.防守();

        }

    }

步骤五:客户端代码


 

static void Main(string[] args)

        {

            Player b = new Forwards("科比");

               b.Attack();

            Player m = new Guards("詹姆斯");

            m.Attack();

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

            y.Attack();

            y.DefenseI();



            Console.Read();

        }



【总结】

 

在软件开发中,系统的数据和行为都正确,但接口不符时,应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

适配器模式的两种类型:类适配器模式和对象适配器模式