Aop(面向切面编程)代理

像上面这样相同代码块在多个地方出现很显然是不可取的,可以通过提取方法来改进:

但是这样有出现一个问题,调用方法仍然是采取硬编码的方式,代码耦合在一起的,说的直接点就是这样就写死了,如果我这个方法不是固定的,我希望调用其他方法怎么办呢?这就可以使用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();
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值