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

/**//*
* Adapter模式经常用来处理遗留代码
*/
package com.XiongYi.designPatterns;
//遗留代码 Circle类 方法drawCircle() 这个类不便做更改
class Circle...{
public void draw()...{
System.out.println("I'm a circle...");
}
}
//现要由于新的需要 要加入一些和Circle地位等价类,比如其中一个叫做Rect
//并要让另一个扮演控制角色的Person类的方法draw()来统一操纵它们
//于是,创建接口Drawable,并让Circle的适配器和Rect的适配器代替他们各自工作
interface Drawable...{
public void draw();
}
//再让原有Circle的适配器CircleAdapter实现Drawable
class CircleAdapter implements Drawable...{
private Circle circle;
public CircleAdapter()...{
circle = new Circle();
}
public void draw() ...{
circle.draw();
}
}
//加入的Rect类
class Rect...{
public void draw()...{
System.out.println("I'm a rect...");
}
}
//同样也让Rect的适配器RectAdapter实现Drawable
class RectAdapter implements Drawable...{
private Rect rect;
public RectAdapter()...{
rect = new Rect();
}
public void draw()...{
rect.draw();
}
}
//最后扮演控制角色的Person类,
//它可以通过work方法根据传入的实现了Drawable接口的对象来统一控制它们工作了
class Person...{
private Drawable drawable;
public Person(Drawable drawable)...{
this.drawable = drawable;
}
public void work()...{
drawable.draw();
}
}

public class Adapter ...{
public static void main(String[] args)...{
new Person(new CircleAdapter()).work();
new Person(new RectAdapter()).work();
}
}
而使用Groovy的话,则变得超级简单:
package com.XiongYi.groovy.designPatters
//遗留代码 Circle类 方法drawCircle() 这个类不便做更改
class Circle...{
def draw()...{
println "I'm a circle..."
}
}
//现在加入Rect类
class Rect...{
def draw()...{
println "I'm a rect..."
}
}
//Person类扮演控制者的角色
class Person...{
private def graphic
Person(args)...{
graphic = args
}
def draw()...{
try...{
graphic.draw()
}catch(MissingMethodException e)...{
println "U can't draw..."
}
}
}

class Adapter ...{
static void main(args) ...{
new Person(new Circle()).draw()
new Person(new Rect()).draw()
}
}可见,正是Groovy的动态语言特性,可以将类型判定一直延后到运行时进行,代码变得如此简单。
欢迎讨论。

本文通过对比Java和Groovy两种语言实现Adapter模式处理遗留代码的方式,展示了Groovy语言的动态特性如何简化代码实现过程。
939

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



