适配器模式主要用于系统的升级和维护。或者是新旧系统对接。前提条件是旧系统不能改动源码的情况下。

 

应用场景:

你去法国旅游、因为国内手机都是220V电压,法国是110V电压,1、你不可能更改你的手机。这个你做不到。2、你不可能更改法国的电路这个更做不到。那办法是什么呢?就是增加一个转换器,把110V转成220V的。以符合你手机充电的要求。这个转换器就是适配器模式
你有一套现成的系统,假如是工厂模式、或者是泛型模式的,系统要求所有产品在系统内正常用都需要符合ISqlHelper接口规范。你有两个产品了。MYSQL\SQLSERVER,这个时候老大命令你增加一个新产品。LUCENE,这个产品不符合ISqlHelper接口规范,1、你不可能更改你的现有系统,这样成本太大,2,LUCENE也是一个现有的产品。你也不能更改。那么如何对接呢?这个时候就要用于适配器模式了。

什么时候需要用适配器模式?

1、比如给旧系统增加一个功能

2、两个旧系统对接

 

适配器模式有两种实现方法。


1、类适配器

使用端:

        static void Main(string[] args)
        {
            ISqlHelper sqlAdapter = new SqlServerHelper();
            sqlAdapter.add();
            sqlAdapter.delete();
            sqlAdapter.update();
            sqlAdapter.search();


            sqlAdapter = new MySqlHelper();
            sqlAdapter.add();
            sqlAdapter.delete();
            sqlAdapter.update();
            sqlAdapter.search();

            sqlAdapter = new MyLuceneAdapter();
            sqlAdapter.add();
            sqlAdapter.delete();
            sqlAdapter.update();
            sqlAdapter.search();

            Console.Read();
        }

接口端:

    interface ISqlHelper
    {
        void add();
        void delete();
        void update();
        void search();
    }

产品端MYSQL:

    public class MySqlHelper : ISqlHelper
    {
        public void add()
        {
            Console.WriteLine("这里是{0}的add", this.GetType());
        }

        public void delete()
        {
            Console.WriteLine("这里是{0}的delete", this.GetType());
        }

        public void search()
        {
            Console.WriteLine("这里是{0}的search", this.GetType());
        }

        public void update()
        {
            Console.WriteLine("这里是{0}的update", this.GetType());
        }
    }

产品端SQLSERVER:

    public class SqlServerHelper : ISqlHelper
    {
        public void add()
        {
            Console.WriteLine("这里是{0}的add", this.GetType());
        }

        public void delete()
        {
            Console.WriteLine("这里是{0}的delete", this.GetType());
        }

        public void search()
        {
            Console.WriteLine("这里是{0}的search", this.GetType());
        }

        public void update()
        {
            Console.WriteLine("这里是{0}的update", this.GetType());
        }
    }

不兼容的产品MYLUCENE

    public class MyLucene
    {
        public void add()
        {
            Console.WriteLine("这里是{0}的add", this.GetType());
        }

        public void delete()
        {
            Console.WriteLine("这里是{0}的delete", this.GetType());
        }

        public void search()
        {
            Console.WriteLine("这里是{0}的search", this.GetType());
        }
    }

现在的问题在于,使用端的代码要求所有提供者(MYSQL,SQLSERVER)都符合ISqlHelper接口规范才可以正常使用。但是现在要扩展一个新产品(LUCENE)进来,这个LUCENE不符合ISqlHelper接口规范,这里我们要用适配器来转换一下就OK了。

mylucene适配器。

 public class MyLuceneAdapter : MyLucene, ISqlHelper
    {
        void ISqlHelper.add()
        {
            base.add();
        }

        void ISqlHelper.delete()
        {
            base.delete();
        }

        void ISqlHelper.search()
        {
            base.search();
        }

        void ISqlHelper.update()
        {
            base.delete();
            base.add();
        }
    }

 

2、对象适配器

    public class SQLLuceneAdapter
    {

        MyLucene mylucene;

        public SQLLuceneAdapter(MyLucene _mylucene) {
            mylucene = _mylucene;
        }

        public void add()
        {
            mylucene.add();
        }

        public void delete()
        {
            mylucene.delete();
        }

        public void search()
        {
            mylucene.search();
        }

        public void update()
        {
            mylucene.delete();
            mylucene.add();
        }
    }

使用:

            SQLLuceneAdapter sqlobjcet = new SQLLuceneAdapter(new MyLucene());
            sqlobjcet.add();
            sqlobjcet.delete();
            sqlobjcet.update();
            sqlobjcet.search();

 

posted on 2016-01-13 17:28  梦回过去  阅读(330)  评论(0编辑  收藏  举报