使用Groovy的Adapter模式来处理遗留代码
如果使用Java语言,针对一个遗留的类Circle,需要建立一个接口,再建立新类和遗留类的适配器实现该接口,再建立一个控制器:
/**/
/*
*Adapter模式经常用来处理遗留代码
*/
package com.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();
}
}
*Adapter模式经常用来处理遗留代码
*/
package com.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的话,则变得超级简单:
package
com.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()
}
}
//遗留代码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的动态语言特性,可以将类型判定一直延后到运行时进行,代码变得如此简单。
欢迎讨论。
文章系本人原创,转载请注明作者和出处