代理模式说明

代理模式

一.概念

​ 代理模式就是AOP面向切面编程的底层原理,在不影响真实角色的情况下,代理角色为真实角色添加其他的功能。

二.分类

​ 1.静态代理
​ 2.动态代理

三.共有的角色说明

​ 1.抽象角色:一般会使用接口或者抽象类来解决。
​ 2.真实角色:被代理的角色;(实现抽象角色);
​ 3.代理角色:代理真实角色:(实现抽象角色的条件下额外添加部分功能);
​ 4.客户角色:访问代理角色的人

实例(租房)

​ 1.抽象角色:租房
​ 2.真实角色:房东
​ 3.代理角色:中介
​ 4.客户角色:自己

四.静态代理

1.抽象角色(租房)
public interface Rent {
	void rent();
}
2.真实角色(房东)
public class Host implements Rent{

	@Override
	public void rent() {
		System.out.println("我要把房子租出去");
	}
}
3.代理角色(中介)

将真实角色添加进来,添加额外功能

public class Proxy implements Rent{
	private Host host;

	public void setHost(Host host) {
		this.host = host;
	}

	@Override
	public void rent() {
		seeHouse();
		host.rent();
		contract();
	}
	
	//看房子
	public void seeHouse(){
		System.out.println("看房子");
	}
	
	//签合同
	public void contract(){
		System.out.println("签合同");
	}
	
}
4.客户角色(客户)
public class Client {
	public static void main(String[] args) {
		Host h=new Host();
		//代理对象帮房东租房子,客户不用找房东,而是直接找中介
		Proxy p=new Proxy();
		p.setHost(h);
		p.rent();
	}
}
代码运行结果
看房子
我要把房子租出去
签合同

静态代理缺点:一个真实角色有一个代理角色,代码会翻倍,开发效率会降低很多。

五.动态代理

介绍:

​ 1.动态代理的本质就是使用的反射机制来实现的;

​ 2.需要掌握两个类:
​ 2.1Proxy;代理类
​ 2.2InvocationHandler:调用处理程序invoke()方法返回处理结果;

​ 3.动态代理和静态代理一样,动态代理的代理类是动态生成的,不是自己写的,动态代理分为两大类,
​ 3.1基于接口的动态代理,接口:JDK动态代理

​ 3.2基于cglib java字节码实现javasist

1.抽象角色(租房)
public interface Rent {
	void rent();
}
2.真实角色(房东)
public class Host implements Rent{

	@Override
	public void rent() {
		System.out.println("我要把房子租出去");
		
	}
	
}
3.代理角色(中介)

该类是动态代理的工具类

public class ProxyInvocationHandler implements InvocationHandler{
	private Object b;
	
	//将真实角色注入到动态代理角色中
	public void setRent(Object b){
		this.b=b;
	}
	
	//生成动态代理类
	public Object getProxy(){
		Object ob=Proxy.newProxyInstance(this.getClass().getClassLoader(),
                                         b.getClass().getInterfaces(),this);
		return ob;
	}
	
	//处理代理实例并返回处理结果
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		seeHouse();
		Object obj=method.invoke(b,args);
		return obj;
	}
	
	public void seeHouse(){
		System.out.println("看房子");
	}
	
	
}
4.客户角色(客户)
public class Client {
	public static void main(String[] args) {
		Host host=new Host();
		//代理类(这里没有代理类,但是有处理程序的类,在该类中获取动态代理)
		ProxyInvocationHandler pih=new ProxyInvocationHandler();
		//设置要代理的对象
		pih.setRent(host);
		//获取动态代理类
		Rent rent=(Rent)pih.getProxy();
		rent.rent();
	}
}
代码运行结果
看房子
我要把房子租出去

六.总结

代理模式的好处(在不改变原有的代码上添加额外的功能):

​ 可以使真实角色的操作更加纯粹(不改变源代码),不用去关注一些公共的业务;
​ 公共业务:就是交给代理角色处理,实现的业务分工,公共业务发生扩展的时候,方便集中管理;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值