Groovy探索之Adapater模式

                           Groovy探索之Adapater模式
 
 
我们知道,Adpater模式的一个作用体现在对旧代码的改造上。比如,像我在前面的文字中讲到的控制灯开关的问题。
有这么一个灯的类:
class Light {
 
       def turnOn()
       {
           println'The light is on,you can do anything……'
       }
       def turnOff()
       {
           println'Be careful!the light is power off……'
       }
 
}
 
 
很简单的一个对象,需要注意的是,这个对象存在于我们的一个引用包里,比如某个JAR包。这使得我们不能对这个类就进行改造。
现在的需要是,我们要创建一个Button类,希望它既能控制Light类对象的开关。同时,也可以控制其他类,如我们自己创建的风扇类(Fan),冰箱类,电视机类等等的开关。
很明显,此类问题的解决方案是:首先创建一个接口,让灯类啊,风扇类、冰箱类等等都实现这个接口,然后把这个接口的实现注入给Button类,就可以实现上面的功能。
这个思路是对的,但现在的难题是我们不能修改Light类,使它实现我们的接口。怎么办?这时候,我们的Adapter模式就派上用场了。
在Java语言的解决方案中,我们使用Adapter模式来解决上述问题,首先要创建一个接口:
public interface Switch
{
        public void turnOn();
        public void turnOff();
}
 
 
然后需要一个中间类来实现这个接口,并且把它的功能委派给Light类:
public class LightAdapter implements Switch
{
        private Light light = new Light();
        public void turnOn()
        {
               light.turnOn();
}
public void turnOff()
{
       light.turnOff();
}
}
 
 
最后来实现Button类:
public class Button
{
        private Switch switch;
        public Button(Switch switch)
        {
               this.switch = switch;
}
public void pressOn()
{
       this.switch.trunOn();
}
public void pressOff()
{
       this.switch.turnOff();
}
}
 
 
这样,我们的Button类通过控制LightAdapter类间接控制了Light类,而其他的风扇类、空调类等等,只是它们实现了Switch接口,就都能被Button类控制。
上面就是Java语言对于Adapter模式的一个解决方案。虽然解决方案很精巧,但绕了一些圈子,使用了一些冗余代码。
通过上面的代码,我们可以看到,本例对于Adapter模式的使用是通过两个委派动作来完成的。即LightAdapter类把动作委派给Light类,而Button类又把动作委派给LightAdapter类等各类。
我们知道,Java语言受语言的限制,对委派的使用很低级。我们可以这么说,正是由于Java语言不能很好的使用委派,才导致了实现Adapter模式的难度。
闲话少说,我们来看看Groovy语言是如何实现上述的Adapter模式的:
class Button {
   
    def delegate
   
    def Button(delegate)
    {
       this.delegate = delegate
    }
   
    def turnOn()
    {
       try
       {
           this.delegate.turnOn()
       }
       catch(MissingMethodException e)
       {
           println"Your class: ${this.delegate.class.name} need to implement turnOn and turnOff function!"
       }
    }
   
    def turnOff()
    {
       try
       {
           this.delegate.turnOff()
       }
       catch(MissingMethodException e)
       {
           println"Your class: ${this.delegate.class.name} need to implement turnOn and turnOff function!"
       }
    }
 
}
 
可以看到,在Groovy语言中,实现上述的Adapter模式根本不需要Switch接口,也不需要LightAdapter类,直接在Button类里把功能委派给各个类对象就行了。当然,我们能在Groovy语言中实现这样的委派,是由Groovy语言的动态性决定的。
当然,使用Button类的前提是要有一个契约:各个功能类,如LightFan等等,都要实现turnOnturnOff方法,不然就提出警告信息。
现在,我们来测试一下Groovy语言的Button类:
     def button = new Button(new Light())
     
     button.turnOn()
     
 button.turnOff()
 
 
运行结果为:
The light is on,you can do anything……
Be careful!the light is power off……
 
 
如果我们的某一个类没有实现turnOn和turnOff方法,如下:
       def button = new Button(new Fan())
 
    button.turnOn()
 
运行结果为:
Your class: Fan need to implement turnOn and turnOff function!
展开阅读全文

没有更多推荐了,返回首页