运用Groovy的Adapter模式来处理遗留代码
使用Groovy的Adapter模式来处理遗留代码
使用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();
}
}
*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()
}
}
//遗留代码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的动态语言特性,可以将类型判定一直延后到运行时进行,代码变得如此简单。
欢迎讨论。
文章系本人原创,转载请注明作者和出处