1.代理模式简介
通过在访问者和提供者中间添加一个代理,这样可以避免访问者直接与提供者的访问。例如:生活中找歌手唱歌,首先需要找到歌手的经纪人,通过经纪人联系歌手。其中经纪人就是一个代理。
作用
- 通过代理,实现对某个对象的访问
分类
- 静态代理(静态定义代理类)
- 动态代理(动态生成代理类)
- jdk自带的动态代理
- CGLIB
动态代理相比于静态代理具有的优势:
- 抽象角色(接口)声明的所有方法都被转移到一个集中的方法中处理,这样我们可以更加灵活和统一的处理众多方法。
2.静态代理的实现
这里使用明星和经纪人的例子进行表示
- 创建接口
public interface Star {
//面谈
void confer();
//签合同
void signContract();
//订票
void bookTicket();
//唱歌
void sing();
//收尾款
void collectMoney();
}
- 明星本人(真实角色)
/**
* 明星本人
*/
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("真实角色面谈");
}
@Override
public void signContract() {
System.out.println("真实角色签合同");
}
@Override
public void bookTicket() {
System.out.println("真实角色订票");
}
@Override
public void sing() {
System.out.println("真实角色唱歌");
}
@Override
public void collectMoney() {
System.out.println("真实角色收尾款");
}
}
- 经纪人(代理角色)
/**
* 经纪人
*/
public class ProxyStar implements Star {
private Star star;
public ProxyStar(Star star) {
this.star = star;
}
@Override
public void confer() {
System.out.println("代理明星去面谈");
}
@Override
public void signContract() {
System.out.println("代理明星去签合同");
}
@Override
public void bookTicket() {
System.out.println("代理明星去订票");
}
@Override
public void sing() {
//唱歌行为经纪人无法代理,所以需要调用歌手
star.sing();
}
@Override
public void collectMoney() {
System.out.println("代理明星收尾款");
}
}
- 测试
public class Client {
public static void main(String[] args) {
Star real = new RealStar();
//实现了对真实角色的代理
Star proxy = new ProxyStar(real);
proxy.confer();
proxy.signContract();
proxy.bookTicket();
//这里代理角色找真实角色进行相应的行为,此时调用者不需要知道内部流程
proxy.sing();
proxy.collectMoney();
}
}
运行效果图
image.png
3.动态代理的实现(JDK)
- 创建接口(抽象角色)
public interface Star {
//面谈
void confer();
//签合同
void signContract();
//订票
void bookTicket();
//唱歌
void sing();
//收尾款
void collectMoney();
}
- 明星(真实角色)
/**
* 明星本人
*/
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("真实角色面谈");
}
@Override
public void signContract() {
System.out.println("真实角色签合同");
}
@Override
public void bookTicket() {
System.out.println("真实角色订票");
}
@Override
public void sing() {
System.out.println("真实角色唱歌");
}
@Override
public void collectMoney() {
System.out.println("真实角色收尾款");
}
}
- 经纪人(代理角色)
public class StarHandler implements InvocationHandler {
Star realStar;
public StarHandler(Star realStar) {
this.realStar = realStar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(realStar,args);
return null;
}
}
- 测试
@Test
public void testProxy(){
Star realStar = new RealStar();
Star proxy = (Star) Proxy.newProxyInstance(realStar.getClass().getClassLoader(),
realStar.getClass().getInterfaces(), new StarHandler(realStar));
proxy.sing();
}
运行效果图
image.png
网友评论