像上面这样相同代码块在多个地方出现很显然是不可取的,可以通过提取方法来改进:
但是这样有出现一个问题,调用方法仍然是采取硬编码的方式,代码耦合在一起的,说的直接点就是这样就写死了,如果我这个方法不是固定的,我希望调用其他方法怎么办呢?这就可以使用aop代理了(aspect Orient programming 面向切口编程)了。
package com.whrd.proxy;
/**
* Description:
* <br /> 被代理对象的接口,代理对象也会实现这个接口
* @author Administrator
*
*/
public interface Dog
{
public void run();
}
package com.whrd.proxy;
/**
* Description:
* <br /> 将要被代理的实现类,代理类可以在调用其方法体之前和之后增加相应的处理
* @author Administrator
*
*/
public class GunDog implements Dog
{
@Override
public void run()
{
System.out.println("我是一条猎狗,所以我疯狂的奔跑(⊙o⊙)…");
}
}
package com.whrd.proxy;
/**
* Description:
* <br /> 将要被代理的实现类,代理类可以在调用其方法体之前和之后增加相应的处理
* @author Administrator
*
*/
public class GunDog implements Dog
{
@Override
public void run()
{
System.out.println("我是一条猎狗,所以我疯狂的奔跑(⊙o⊙)…");
}
}
package com.whrd.proxy;
/**
* Description:
* <br /> 这个类就相当于代理类要增加的处理方式
* @author Administrator
*
*/
public class DogUtils
{
public static void runOnHighway()
{
System.out.println("我在高速路上奔跑");
}
public static void runOnSubway()
{
System.out.println("我在地铁里奔跑");
}
}
package com.whrd.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test
{
public static void main(String[] args)
{
Dog dog = (Dog)Proxy.newProxyInstance(Dog.class.getClassLoader(), new Class<?>[]{Dog.class},
new InvocationHandler()
{
//代理对象中一定要包含一个被代理对象的引用
private Dog dog = new GunDog();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
//代理类增加了自己的处理逻辑
DogUtils.runOnHighway();
dog.run();
return null;
}
});
Dog dog2 = (Dog)Proxy.newProxyInstance(Dog.class.getClassLoader(), new Class<?>[]{Dog.class},
new InvocationHandler()
{
private Dog dog = new GunDog();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
dog.run();
//代理类增加了自己的处理逻辑
DogUtils.runOnSubway();
return null;
}
});
/*
我在高速路上奔跑
我是一条猎狗,所以我疯狂的奔跑(⊙o⊙)…
********************
我是一条猎狗,所以我疯狂的奔跑(⊙o⊙)…
我在地铁里奔跑
*/
dog.run();
System.out.println("********************");
dog2.run();
}
}