设计模式在实际开发中的使用——代理模式

代理模式,为其他对象提供一种代理以控制对这个对象的访问。

最典型的应用是Spring的AOP。

 

代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。

 

静态代理的实现

以代理用户Service为例

接口类

public interface UserService {
	public void addUser();
}

实现类

public class UserServiceImpl implements UserService {
	public void addUser() {
		System.out.println("add user...");
	}
}

代理类

public class UserProxy implements UserService{
	private UserService userService;  
	  
    public UserProxy(UserService userService) {  
        this.userService = userService;  
    }

	public void addUser() {
		this.before();
		userService.addUser();
		this.after();
	}  
	
	private void before(){
		System.out.println("before");
	}
	private void after(){
		System.out.println("after");
	}
}

测试方法

		UserService userService = new UserServiceImpl();
		UserProxy proxy = new UserProxy(userService);
		proxy.addUser();

 

使用jdk实现动态代理

代理类改为

public class UserProxy implements InvocationHandler {
	private Object target;

	public Object bind(Object target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		this.before();
		result = method.invoke(target, args);
		this.after();
		return result;
	}

	private void before(){
		System.out.println("before");
	}
	private void after(){
		System.out.println("after");
	}
	
}

测试类

UserProxy proxy = new UserProxy();
		UserService userService = (UserService)proxy.bind(new UserServiceImpl());
		userService.addUser();

 

cglib实现动态代理

jdk动态代理必须依赖接口(UserService),用cglib可以解决该问题。cglib的原理是对指定的目标类生成一个子类,因为采用的是继承,所以不能对final修饰的类进行代理。

代理类

public class UserProxy implements MethodInterceptor {
	private Object target;

	public Object getInstance(Object target) {  
        this.target = target;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.target.getClass());  
        // 回调方法  
        enhancer.setCallback(this);  
        // 创建代理对象  
        return enhancer.create();  
    } 

	 // 回调方法  
    public Object intercept(Object obj, Method method, Object[] args,  
            MethodProxy proxy) throws Throwable {  
        this.before();  
        proxy.invokeSuper(obj, args);  
        this.after();
        return null;  
    } 

	private void before(){
		System.out.println("before");
	}
	private void after(){
		System.out.println("after");
	}
	
}

测试代码

		UserProxy proxy = new UserProxy();
		UserService userService = (UserService)proxy.getInstance(new UserServiceImpl());
		userService.addUser();

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值