使用Groovy的Adapter模式来处理遗留代码
如果使用Java语言,针对一个遗留的类Circle,需要建立一个接口,再建立新类和遗留类的适配器实现该接口,再建立一个控制器:

/**//*
*Adapter模式经常用来处理遗留代码
*/
packagecom.XiongYi.designPatterns;
//遗留代码Circle类方法drawCircle()这个类不便做更改
classCircle...{
publicvoiddraw()...{
System.out.println("I'macircle...");
}
}
//现要由于新的需要要加入一些和Circle地位等价类,比如其中一个叫做Rect
//并要让另一个扮演控制角色的Person类的方法draw()来统一操纵它们
//于是,创建接口Drawable,并让Circle的适配器和Rect的适配器代替他们各自工作
interfaceDrawable...{
publicvoiddraw();
}
//再让原有Circle的适配器CircleAdapter实现Drawable
classCircleAdapterimplementsDrawable...{
privateCirclecircle;
publicCircleAdapter()...{
circle=newCircle();
}
publicvoiddraw()...{
circle.draw();
}
}
//加入的Rect类
classRect...{
publicvoiddraw()...{
System.out.println("I'marect...");
}
}
//同样也让Rect的适配器RectAdapter实现Drawable
classRectAdapterimplementsDrawable...{
privateRectrect;
publicRectAdapter()...{
rect=newRect();
}
publicvoiddraw()...{
rect.draw();
}
}
//最后扮演控制角色的Person类,
//它可以通过work方法根据传入的实现了Drawable接口的对象来统一控制它们工作了
classPerson...{
privateDrawabledrawable;
publicPerson(Drawabledrawable)...{
this.drawable=drawable;
}
publicvoidwork()...{
drawable.draw();
}
}

publicclassAdapter...{
publicstaticvoidmain(String[]args)...{
newPerson(newCircleAdapter()).work();
newPerson(newRectAdapter()).work();
}
}
而使用Groovy的话,则变得超级简单:
packagecom.XiongYi.groovy.designPatters
//遗留代码Circle类方法drawCircle()这个类不便做更改
classCircle...{
defdraw()...{
println"I'macircle..."
}
}
//现在加入Rect类
classRect...{
defdraw()...{
println"I'marect..."
}
}
//Person类扮演控制者的角色
classPerson...{
privatedefgraphic
Person(args)...{
graphic=args
}
defdraw()...{
try...{
graphic.draw()
}catch(MissingMethodExceptione)...{
println"Ucan'tdraw..."
}
}
}

classAdapter...{
staticvoidmain(args)...{
newPerson(newCircle()).draw()
newPerson(newRect()).draw()
}
} 可见,正是Groovy的动态语言特性,可以将类型判定一直延后到运行时进行,代码变得如此简单。
欢迎讨论。
文章系本人原创,转载请注明作者和出处
本文对比了使用Java和Groovy实现Adapter模式处理遗留代码的方法。通过Groovy的动态特性,可以极大简化代码,无需创建额外的适配器类即可实现接口的适配。
936

被折叠的 条评论
为什么被折叠?



