设计模式学习笔记七(Adapter适配器模式)

适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。

动机:在软件系统中,由于应用环境的变化,常常需要将“一些现存对象”放在新的环境中使用,但是新环境中要求的接口是这些现存对象不能满足的。如何应对这种“迁移的变化”,如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口。

意图:将一个类的接口转换成客户需要的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可能一起工作。

 

基本Code

using  System;

using  System.Collections;

 

interface  IStack        //客户期望的接口

{

     void Push(object item);

     object Pop();

     object Peek();

}

 

//对象适配器

class  Adapter:IStack     //适配对象

{

     ArrayList  adaptee;  //被适配对象

     public  Adapter()

     {

         adaptee =new ArrayList();

     }

     public  void  Push(object item)

     {

         adaptee.Add(item);

     }

     public  object  Pop()

     {

         return  adaptee.RemoveAt(adaptee.Count-1);

     }

     public object  Peek()

     {

         return  adaptee [adaptee.Count-1];

     }

}

 

//类适配器

class  Adapter:ArrayList,IStack     //适配对象

{

     public  void  Push(object item)

     {

         this.Add(item);

     }

     public  object  Pop()

     {

         return  this.RemoveAt(this.Count-1);

     }

     public object  Peek()

     {

         return  this [this.Count-1];

     }

}

 

对象适配器结构图如下:

事实上,AdapterAdaptee两个对象是组合关系。

类对象适配器结构图如下:

事实上,在上图中,AdapterAdaptee是继承的关系,这种适配器结构在现实中用得很少,我们推荐使用第一种适配器模式。

 

 

Adapter的要点

1、  Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2、  GoF 23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合。对象适配器采用“对象组合”的方式,更符合松耦合的精神。

3、  Adapter模式可以实现得非常灵活,不必拘泥于GoF 23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法的参数,来达到适配的目的。

4、  Adapter模式要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便的适配。

 

.NET  FrameworkAdapter的应用:

1、  .NET中复用COM对象:

COM对象不符合.NET对象的接口。我们可以使用Tlbimp.exe来创建一个Runtime  Callable  WrapperRCW)以使其符合.NET对象的接口。

2.NET数据访问类(Adapter变体)

         各种数据库并没有提供DataSet接口。使用DbDataAdapter接口可以将任何数据库访问/存取适配到一个DataSet对象上。

3、集合类中对现有对象排序(Adapter变体)

现有对象未实现IComparable接口。实现一个排序适配器(继承IComparable接口),然后在其Compare方法中对两个对象进行比较。

 

对对象排序的实现:

public  class  Employee

{

     private  int  age;

    public  int  Age

    {

         get{ return  age;}

         set{ age=value;}

     }

    //…….

}

 

public  class  EmployeeSortAdapter:IComparable

{

     public  int  Compare(object obj1,object obj2)

     {

         Employee  e1=(Employee) obj1;

        Employee  e2=(Employee) obj2;

         if (e1.Age==e2.Age)

         {

              return  0;

         }

         if (e1.Age>e2.Age)

         {

              return  1;

         }

         if (e1.Age<e2.Age)

          {

              return  -1;

        }

 

     }

}

 

class  App

{

     static  void  Main()

     {

         Employee[]  employees=new  Employee[100];

         //……

        Array.Sort(employees,new EmployeeSortAdapter());

     }

}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值