关于模式实现的讨论
本模式在实现时有以下这些值得注意的地方:
第一、目标接口可以省略。此时,目标接口和源接口实际上是相同的。 由于源是一个接口,而变压器类是一个类(或抽象类),因此这种做法看似平庸而并不平庸, 它可以使客户端不必实现不需要的方法。这一点已经在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()不变。源代码如下:
package com.javapatterns.adapter.kittie2doggie;
public interface doggie
{
void wao();
void fetchball();
void run();
void sleep();
void setname(string name);
string getname();
}
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; }
}
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);
}
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器