我也想问个adapter的问题?

当需要既打方形桩,又打圆形桩时
用如下实现:
-------------------------------------------------------------
public class SquarePeg{
  public void insert(String str){
    System.out.println("SquarePeg insert():"+str);
  }

}
-------------------------------------------------------------
public class RoundPeg{
  public void insertIntohole(String msg){
    System.out.println("RoundPeg insertIntoHole():"+msg);
}
}
-------------------------------------------------------------
public class PegAdapter extends SquarePeg{

  private RoundPeg roundPeg;

  public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)

  public void insert(String str){ roundPeg.insertIntoHole(str);}

}
可是PegAdapter重载了SquarePeg的insert方法,只是在这个方法里生成了
圆桩,并没有生成方桩阿?为什么说需要既打方形桩,又打圆形桩呢?

首先你得明白需要 Adapter 的原因。

假设你需要打桩,又打 RoundPeg 又打 SquarePeg。你可以这样设计:

public interface IPeg
{
void Insert(String messsage);
}

public class RoundPeg implements IPeg
{
public void Insert(String message)
{
//...
}
}

public class SquarePeg implements IPeg
{
public void Insert(String message)
{
//...
}
}

这样你需要打桩时,只需要定义类似下面的方法:

public class BlahBlah
{
public void DoIt(IPeg thePeg)
{
// ... doing something to get message ...
thePeg.Insert(message);
}

}

如果情况如上所述,就不需要 Adapter 出现了。但是,问题出现了,如果别人已经完整实现了打圆形桩的方法,但是没有实现 IPeg 接口,你怎么办?这时候就需要 Adapter. 如下所示:

已有实现:

public class RoundPeg
{
public void InsertIntoHole(String message)
{
//...
}
}

你需要做一个 Adapter

public class RoundPegAdapter implements IPeg
{
private RoundPeg _roundPeg;

// 构造
public RoundPegAdapter(RoundPeg roundPeg)
{
_roundPeg = roundPeg;
}

// 实现接口
public void Insert(String message)
{
_roundPeg.Insert(message);
}
}

Ok, that's all.

Sorry, 有个错误。改正一下:


// 实现接口
public void Insert(String message)
{
_roundPeg.Insert(message);
}

应该改为:



// 实现接口
public void Insert(String message)
{
_roundPeg.InsertIntoHole(message);
}

那比如这样
现有两个DAO:ADAO和BDAO,
public class ADAO {

public ADAO(String s){
......
}
public int insert(String ss){
......
}
}

public class BDAO{

public int delete(){

}
}

我现在定义了一个CDAO
public CDAO extends BDAO {
ADAO aDAO;

public CDAO(ADAO aDAO){
this.aDAO =aDAO;
}

public int insert(String ss){
int sss = aDAO.insert(ss);
return sss;

}
然后我在别的类中可以用CDAO的insert和delete方法,这样做算不算是用了adapter模式呢


}

>>然后我在别的类中可以用CDAO的insert和delete方法,这样做算不算是用了adapter模式呢

我觉得不算。关于 Adapter 这么说是不是清楚一点。

假设,你买了新房子,现在的任务是要装修。装修其中的一个内容是对屋内的电线重新布置,安置插座。现在出现问题了,为了匹配各种各样的插头,你是不是要在同一个部位,装上很多不同插孔形状的插座呢?当然你不会干,那多难看呀,而且多余!解决的办法就是装最常用的插孔的插座,其他的怪插头,由接线板来解决。这时候的接线板就是 Adapter;而各种不同形状的插头就是别人已经实现好的class,你无法修改它们;而你安装的那种插座类型,就是Adapter使用的Interface。

似乎
把一个实现了的类当
内部对象来使用,重新包装,就是adapter.
对吗

似乎
把一个实现了的类当
内部对象来使用,重新包装,就是adapter.

引用
实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).