电脑技术学习

java结构性模式之变压器模式介绍(四)

dn001
内容: 关于模式实现的讨论

  本模式在实现时有以下这些值得注意的地方:

  第一、目标接口可以省略。此时,目标接口和源接口实际上是相同的。 由于源是一个接口,而变压器类是一个类(或抽象类),因此这种做法看似平庸而并不平庸, 它可以使客户端不必实现不需要的方法。这一点已经在WindowAdapter的例子里做了详尽的分析。

  第二、变压器类可以是抽象类。这已经在WindowAdapter的例子里看到了。实际上,WindowAdapter的例子过于简单。 实际的情形里,你可能想给出一些实方法。

  第三、带参数的变压器模式。使用这种办法,变压器类就不必,有时可能不能是源类的子类。 变压器类根据参数返还一个合适的实例给客户端。

  问答题

  第1题、请做一个小猫(kittie)的实类,并实现miao(),catchRat(),run(),sleep()等方法。 再做一个小狗(doggie)的接口,要求有wao(),fetchBall(),run(),sleep()等方法。

  现在你的女朋友想要一只小狗,可是你只找到的一只小猫。请用变压器模式把小猫“适配成小狗, 让你的女朋友满意。(提示:量力而为。)

  第2题、请指出第一题的解答所使用的是那一种形式的变压器模式。

  第3题、笔者在许多场合给各种不同水准的专业人士作过各种编程模式的介绍,发现参加OOP开发工作的不同时间长短的人, 对不同的模式理解接受的速度有所不同。唯独在讲过这个男朋友与小狗小猫的例子后,大家对变压器模式的理解都很准确。 让笔者百思不得其解。你知道这是怎样回事吗?

  第4题、请讲一讲使用实例形式的变压器模式和使用类形式的变压器模式在第一题的解决上有何影响。
问答题答案

  第1题、根据提示,我们可以量力而为。因此,我们将把miao()“适配成wao(),catchRat()“适配成fetchBall(), run(),sleep()不变。源代码如下:

IMG http://www.yesky.com/20011225/jt1225-1-kittie2doggie.gif[/IMG]package com.javapatterns.adapter.kittie2doggie;
public interface Doggie
{
void wao();
void fetchBall();
void run();
void sleep();
void setName(String name);
String getName();
}

代码清单11. SwingUI类的源代码。红色的代码就是使用WindowAdapter的无名内部类。


package com.javapatterns.adapter.kittie2doggie;
public class Kittie {
public void miao(){}
public void catchRat() {
}
public void run() {
}
public void sleep() {
}
public String getName(){ return name; }
public void setName(String name){ this.name = name; }
}

代码清单12. SwingUI类的源代码。红色的代码就是使用WindowAdapter的无名内部类。


package com.javapatterns.adapter.kittie2doggie;
public class Boyfriend extends Kittie implements Doggie
{
public void wao()
{
this.miao();
}
public void fetchBall()
{
this.catchRat();
}
public void run()
{
super.run();
}
public void sleep()
{
super.sleep();
}
public String getName()
{
return super.getName();
}
public void setName(String name)
{
super.setName(name);
}
}

代码清单13. SwingUI类的源代码。红色的代码就是使用WindowAdapter的无名内部类。

  怎么,她不满意呀?那也有办法:把wao(),fatchBall()当作新的方法,在变压器类中实现。由于你扮演变压器角色, 当她调用wao(),fatchBall()方法是,你就叫一声,或把球捡回来就可以了。

  你不满意呀?那就再去找一只真正的小狗吧。变压器模式的威力就到此为止了。

  第2题、这里使用的是类形式的变压器模式。

  第3题、我的一个学生告诉我,理解这个问题的关键,即男朋友必须装小狗。

  第4题、使用类形式的结果是,她一旦想要另一个宠物,她就得换一个男朋友。 使用实例形式的变压器模式的结果是,她如果想要另一个宠物,原来的男朋友就得身兼几种身份。
from-yesky Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd

标签: