java代理模式(Proxy Pattern)

一、代理模式的概念

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二、代理分类

1、静态代理

    代理类由程序员创建,程序运行前已经确定了代理类和被代理类的对应关系。

2、动态代理

    代理类不由程序员创建,程序运行期间创建代理类对象。

3、cglib代理(暂时不写)

三、代码实现

    1、静态代理

        1>创建接口

package com.test.proxy;
public interface Subject {
	void request();
}

        2>创建真实对象实现接口

package com.test.proxy;
public class RealSubject implements Subject{
	@Override
	public void request() {		
		System.out.println("真实对象-----------");
	}
}

        3>创建代理对象实现接口

package com.test.proxy;
public class ProxySubject implements Subject{	
	private Subject subject;	
	public ProxySubject(Subject subject) {
		this.subject = subject;
	}
	@Override
	public void request() {		
		System.out.println("begin");
		subject.request();
		System.out.println("end");		
	}
}

        4>测试类

package com.test.proxy;

public class ProxyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		RealSubject realSubject = new RealSubject();
		ProxySubject pSubject = new ProxySubject(realSubject);
		pSubject.request();
		
//		ProxyFactory.getIntance().request();
	}

}
------------测试结果-----------
begin
真实对象-----------
end

        5>创建代理类工厂(使用代理时不用每次都创建代理类对象和真实类对象)

package com.test.proxy;

public class ProxyFactory {
	
	public static Subject getIntance(){
		
		return new ProxySubject(new RealSubject());
	}
}

    2、动态代理

        1>创建接口

package com.test.dynamicproxy;

public interface DynamicProxy {
	
	void request(String str);
}

        2>创建真实对象实现接口

package com.test.dynamicproxy;

public class RealObj implements DynamicProxy{

	@Override
	public void request(String str) {
		
		System.out.println("动态代理真实对象=======" + str);
	}
	
}

        3>创建代理对象实现jdk中的InvacationHandler接口

package com.test.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyObj implements InvocationHandler{
	
	private Object target;
	
	public ProxyObj(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		System.out.println("进入代理类---------");
		Object object = method.invoke(target, args);
		System.out.println("执行完真实类方法之后--------");
		return object;
	}
	
	/**
	 * 获取代理对象
	 * @return
	 */
	public Object getProxy(){
		
		return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
				target.getClass().getInterfaces(), this);
	}

}

        4>测试类

package com.test.dynamicproxy;

public class TestDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		DynamicProxy real = new RealObj();
		ProxyObj inHandler = new ProxyObj(real);
		DynamicProxy dyProxy = (DynamicProxy) inHandler.getProxy();
		dyProxy.request("1111");
	}

}
----------测试结果----------
进入代理类---------
动态代理真实对象=======1111
执行完真实类方法之后--------
四、应用场景

    1.在原方法执行之前和之后做一些操作,可以用代理来实现(比如记录Log,做事务控制等)。 
    2.
封装真实的主题类,将真实的业务逻辑隐藏,只暴露给调用者公共的主题接口。



 

   

 

 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值