深入浅出学习设计模式(C#实现)-适配器模式

来源:互联网 发布:杭州电魂网络科技股份 编辑:程序博客网 时间:2024/05/24 01:22

1.提出话题,

适配,顾名思义就是甲事物与乙事物适合配套;而适配器,器物,也就是一个接口转换器,还是使两个事物适合配套。其实,这在我们生活中是很常见的,比如我们的笔记本电脑是不能什么电压都能用的,但是国家不同,电压不同也是事实,有些国家用110V电压,而我们国家是220V电压,所以这个时候,我们就需要一个电源适配器,只要是电,不管多少伏,都能把电源变成需要的电压,这就是电源适配器的作用。同样的道理同样可以应用于我们的编程世界。

2.定义:

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

3.分类:对象适配器模式和类适配器模式

3.1.对象适配器模式:


从图中可以看出,对于客户端来说,调用的就是TargetRequest()方法。Target,这是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口。而Adaptee没有Request()方法,为了使客户端可以使用Adaptee类,所以此时需要提供一个包装类Adapter类,这个包装类包装了一个Adaptee对象实例,从而将客户端与Adaptee连接了起来。

代码实现:

class Program    {        static void Main(string[] args)        {            Target target = new Adapter  ();            target.Request();//对客户端来说,调用的就是Target的Request()            Console.Read();        }        //Target类,即客户所期待的接口。目标可以是具体或抽象的类,也可以是接口        class Target        {            public virtual void Request()            {                Console.WriteLine("普通请求!");            }        }        //Adaptee(需要适配的类)        class Adaptee        {            public void specificRequest()            {                Console.WriteLine("特殊请求!");            }        }        //Adapter(通过在内部包装一个Adaptee对象,把原接口转换成目标接口)        class Adapter :Target         {            //建立一个私有的Adaptee对象,            private Adaptee adaptee = new Adaptee();            public override void Request()            {                //这样就可以把表面上调用Request()方法变成实际调用SpecificREQUEST()                adaptee.specificRequest();            }        }    }


3.2.类适配器模式


从图中可以看出,和对象适配器的功能是非常相似的,所不同的就是适配器Adapter继承自己实现的类(一般为多重继承,c++支持)

代码实现:

// "ITarget"  class Target  {  public:      // Methods      virtual void Request(){};  };    // "Adaptee"  class Adaptee  {  public:      // Methods      void SpecificRequest()      {          cout<<"Called SpecificRequest()"<<endl;      }  };    // "Adapter"  class Adapter : public Adaptee, public Target  {  public:      // Implements ITarget interface      void Request()      {          // Possibly do some data manipulation          // and then call SpecificRequest            this->SpecificRequest();      }  };      int main()  {      // Create adapter and place a request      Target *t = new Adapter();      t->Request();        return 0;  


4.使用要点:

1.当系统的数据和行为都正确,但是接口不符,我们应该考虑适配器。

2.当双方都不太容易修改的时候再使用适配器模式适配。在开发初期,一般都考虑对类和方法的命名进行规范,重构统一接口。

3.设计之初,考虑使用第三方开发组建,而此组建与我们自己的系统接口是不同的时候,也可由考虑适配器模式

0 0
原创粉丝点击