我也想问个adapter的问题?

03-03-24 hitdemo2002
    

当需要既打方形桩,又打圆形桩时

用如下实现:

-------------------------------------------------------------

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方法,只是在这个方法里生成了

圆桩,并没有生成方桩阿?为什么说需要既打方形桩,又打圆形桩呢?

    

manbaum
2003-03-25 09:18

首先你得明白需要 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.

manbaum
2003-03-25 09:20

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

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

应该改为:

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

hitdemo2002
2003-04-02 21:38

那比如这样

现有两个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模式呢

}

manbaum
2003-04-07 13:20

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

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

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

2Go 1 2 下一页