求教设计模式之Adapter(适配器)的问题

07-04-09 tellhow

现在有一个应用,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:

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()方法.

可以实现打圆形桩,但如果要打方形桩,该如何实现呢?

请banq大虾不吝赐教!

         

banq
2007-04-09 16:41
>可以实现打圆形桩,但如果要打方形桩,该如何实现呢?

要打方形桩参考打圆形桩方式.

设计模式和代码展现的是一种模式和方式,可以重用的.

tellhow
2007-04-10 10:26
首先感谢banq大虾的回复!

我是菜鸟,对Adapter(适配器)也不太理解,如果提出幼稚的问题,还请大虾耐心教导!

我对Adapter(适配器)的理解:

将两个不兼容的类纠合在一起使用,并实现这两个不兼容类的功能.(这两个类对我们是透明的,我们只知道其方法而不知道其代码.)

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()方法被重载了.

PegAdapter p=new PegAdapter(peg);

p.insert(str);//打圆形桩

PegAdapter类能实现打圆形桩的功能,打方形桩的功能却不知道如何实现了.

我对代码做了如下修改:

public class PegAdapter extends SquarePeg{

  private RoundPeg roundPeg;

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

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

}

PegAdapter类不重载insert()方法.

PegAdapter p=new PegAdapter(peg);

p.insert(str);//打方形桩

p.insertIntoHole(str);//打圆形桩

这样一来,PegAdapter类既能实现打圆形桩的功能,也能实现打方形桩的功能了.

有什么不对的地方,还请banq大虾指出,谢了!

power1128
2007-04-15 13:14
我是这样理解的,作者的意思是,现在有一个打方形桩的系统,比如叫SquareClient,它可能会调用SquarePeg的insert()方法,这个SquareClient和SquarePeg是我们已经有的系统,现在出现了另一个RoundPeg类,我们希望SquareClient也能操作它,并且不用修改代码。我们引入adapter,注意PegAdapter extends SquarePeg,也就是说PegAdapter是SquarePeg的子类,这样我们的SquareClient就能透明的操作这个类了,比如:

//用圆形桩对象为参数,构造adapter

PegAdapter square = new PegAdapter(roundObject);

SquareClient client = new SquareClient();

client.setPeg(square);

//客户端不用修改,同样是调用insert,实际上是调用方形桩的insertIntoHole

client.insert();

tellhow
2007-04-16 11:14
首先感谢power1128大哥的回复!

看完回复我似乎明白了点!

//用圆形桩对象为参数,构造adapter

PegAdapter square = new PegAdapter(roundObject);

SquareClient client = new SquareClient();

client.setPeg(square);

//客户端不用修改,同样是调用insert,实际上是调用方形桩的insertIntoHole

client.insert();

上面的代码是否可以这样理解:

SquareClient类的setPeg()方法中的参数只能是SquarePeg类及其子类。而我们要使client.insert()既能打方形桩也能打圆形桩:

//用圆形桩对象为参数,构造adapter

PegAdapter square = new PegAdapter(roundObject);

SquarePeg square2 = new SquarePeg();

SquareClient client = new SquareClient();

client.setPeg(square);

//打圆形桩;

client.insert();

client.setPeg(square2);

//打方形桩;

client.insert();

我开始一直把PegAdapter类理解成既能打方形桩也能打圆形桩的。

现在我明白了:PegAdapter类就像SquarePeg类娶进门的老婆,徒有名分而已,而实际上天天晚上和RoundPeg类睡在一起。

猜你喜欢
6Go 1 2 3 4 ... 6 下一页