一、代理知识点
image.png二、什么是代理
简单的说,代理就是中介。举个例子,你要买房子,涉及的的角色有,中介(代理对象)、业主(真实对象)、卖房子(抽象角色行为)。
三、静态代理实现
1.抽象角色行为
package proxy;
/**
* 抽象角色-行为(代理对象和真实对象需要实现的行为)
*/
public interface Sell {
void sell();
}
2.真实对象(实际业务)
package proxy;
public class Owner implements Sell {
@Override
public void sell() {
System.out.println("业主卖房子");
}
}
3.代理对象(持有抽象角色完成实际业务,可以扩展)
package proxy;
public class Agent implements Sell {
private Sell seller;
public Agent(Sell seller) {
this.seller = seller;
}
@Override
public void sell() {
before();
seller.sell();
after();
}
/**
* 操作之前
*/
private void before(){
System.out.println("付给中介部分服务费");
}
/**
* 操作之后
*/
private void after(){
System.out.println("付给中介所有服务费");
}
}
4.操作实现
public static void main(String[] args) {
Owner owner = new Owner();
Agent agent = new Agent(owner);
agent.sell();
}
四、动态代理实现
假设现在中介代理多一个相亲业务。
1.增加一个抽象业务
/**
* 相亲介绍
*/
public interface Matchmaker {
void introduce();
}
2.相亲公司实现业务
package proxy;
/**
* 婚庆公司
*/
public class MarriageCompany implements Matchmaker {
@Override
public void introduce() {
System.out.println("介绍美女给你");
}
}
3.动态代理根据情况实现卖房子还是相亲介绍
package proxy;
import java.lang.reflect.Proxy;
public class Test {
private static Owner sell;
private static MarriageCompany company;
public static void main(String[] args) {
//动态代理
//卖房子
sell = new Owner();
//相亲
company = new MarriageCompany();
//type 1= 卖房子 2=相亲
Object o = proxyBusiness(1);
Sell sell = (Sell) o;
sell.sell();
Object o2 = proxyBusiness(2);
Matchmaker matchmaker = (Matchmaker) o2;
matchmaker.introduce();
}
/**
* 代理实际业务
*/
public static Object proxyBusiness(int type){
return Proxy.newProxyInstance(Test.class.getClassLoader(), new Class[]{Sell.class, Matchmaker.class},
(proxy, method, args) -> {
Object object = type == 1 ? sell : company;
return method.invoke(object,args);
});
}
}
五、静态代理和动态代理的优缺点
1.静态代理
一般一个代理对象代理一个抽象业务,如果有多个抽象业务,需要定义多个代理类。
2.动态代理
可以根据实际的抽象业务,动态生成代理到内存中。
网友评论