设计模式——代理模式

代理模式

代理设计模式就是将辅助性的操作交给代理类区完成,真正操作交给真实主体类

静态代理
public interface Subject {
	/**
	 * 主体对象要做的事
	 */
	public void sleepWithfei();

}
package dailims;

public class EmperorA implements Subject{

	@Override
	public void sleepWithfei() {
		System.out.println("皇帝要和妃子睡觉");	
	}

}

package dailims;

public class WangGong{
	private Subject subject;

	public WangGong(Subject subject) {
		this.subject = subject;
	}
	public void invoke(){
		System.out.println("接妃子");
		this.subject.sleepWithfei();
		System.out.println("送妃子");
	}
	
}
public class Test {
	public static void main(String[] args) {
		Subject subject = new EmperorA();
		WangGong proxy = new WangGong(subject);
		proxy.invoke();
	}

}

在这里插入图片描述

动态代理
package dailims;

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

public class WangGong implements InvocationHandler{
	private Subject subject;

	public WangGong(Subject subject) {
		this.subject = subject;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("接人");
		Object resultObject =  method.invoke(subject, args);
		System.out.println("送人");	
		return resultObject;
	}
}

package dailims;

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

public class Test {
	public static void main(String[] args) {
		//创建真实类主体类对象
		Subject subject = new EmperorA();
		//创建代理主体类的对象
		InvocationHandler handler=new WangGong(subject);
		Subject proxySubject=(Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler);
		proxySubject.sleepWithfei();
		
	}
}
总结

- 通过Proxy.newProInstance()取得的对象本质上实现了Subject接口,所以可以将其强制转换成Subject类型,同时又继承了Proxy类。
- 之所以能够调用触发动态代理类的invoke方法,在$Proxy0中执行sleepWith()方法的时候本质上是调用了父类(Proxy)中h对象的invoke方法。
$Proxy0是Proxy.newProInstance()对应的类,是动态生成的,
$Proxy0.class是直接以二进制的方式加载到内存中,并没有对应的class文件,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值