java设计模式学习5--Adapter Pattern[原创]

  昨天写了点适配器模式的心得,由于写得不怎么清楚,索性删掉。
  今天停了一天的电,白天根本写不了东西,唉~~
  晚上来电了,开始写东西。  

  上次写了建造模式,现在再来看看适配器模式。
  先说变压器(Adapter),变压器把一种电压变换成另一种电压。再看个成语,“移花接木”。  我们经常碰到要将一个类的接口转换成客户希望的另外一个接口,即让一个类里的某方法体现出另一个类里某方法产生的效果,或者是增加一个类的方法到另外一个类里。第一解决方案是:修改或增加类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改接口。 怎么办?
  这个时候就要用到适配器了。
  先看看下面的图:
  

对象的适配器(Adapter)模式

类的适配器(Adapter)模式
  

  总的说来,就是客户访问Target的request( )方法,希望得到Adaptee中的specialRequest( )方法。
  Adapter继承Target,因此客户可以访问Adapter了,在Adapter中,怎么得到specialRequest( )方法呢?
  Adapter要得到Adaptee中的( )pecialRequest方法,可以有2种方式:
  1.Adapter中没有specialRequest方法,它只是个中转站,它转而访问Adaptee得到specialRequest。
  2.Adapter中存在specialRequest方法。
  方法1中的,就是组合方式,而方法2则是继承方式。
  第一种方法,是对象的适配器,第二种是类的适配器。
  先说对象的适配器,看看下面的代码:
  public class Adapter extends Target
  {
   private Adaptee adaptee;
   public Adapter(Adaptee adaptee)
   {
    super( );
                this.adaptee=adaptee;
   }
   public void request( )
      {
    adptee.specialRequest( );
   }
       }
  Adapter 继承了Target,并重载了Target的request方法,使得结果得到specialRequest方法,满足了要求。
  这个时候,Adapter叫做对象适配器,我们可以这么想,Adapter起的不是介绍对象的作用么?
  一个对象适配器可以把多种不同的Adaptee适配到同一个目标(同一个适配器可以把源类和它的子类都适配到目标接口)。
  对象适配器允许Target和Adaptee完全无关,只有Adapter知道二者的存在。
  下面来说说类适配器。
  对象适配器只继承了Target,但是,同样Adapter也可以继承Adaptee。由于java不允许多继承,所以要用到接口。
  现在,我们把Adaptee变成继承一个接口,Adapter也继承同个接口,这样在Adapter中就存在specialRequest方法了,客户就可以直接访问Adapter.specialRequest( )了,
  public interface IAdaptee {
   public void specialRequest( );
   ……
  }

  public class Adaptee implements IAdaptee {
   public void Adaptee ( ) {
    //......
   }
   public void specialRequest( ){
     //......
   }
   }

        public class Adapter extends Target implements IAdaptee {

   private Adaptee adptee;
   public Adapter(Adaptee adptee) {
     this.adptee=adptee;
   }
   public void specialRequest( ) {
     adptee.specialRequest( );
   }
  }

  在这种情况下,如果Target和Adaptee有一个相同名字的方法,Adapter不能保证这两个方法具有相同的含义或者行为,它不知道到底该用哪个方法,这是非常危险的,要注意。

  我认为,适配器的功能只需要做到转换作用,我看到网上有什么在适配器里置换源类的方法什么的,有必要放适配器里吗?还看得人一楞一楞的,真是伤脑筋。

原文地址:https://www.cnblogs.com/zxub/p/178629.html