代理模式(Proxy pattern):
通过代理,控制对对象的访问!
可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即:AOP的微观实现)
- 核心角色:
抽象角色
– 定义代理角色和真实角色的公共对外方法
真实角色
– 实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
– 关注真正的业务逻辑!
代理角色
– 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
– 将统一的流程控制放到代理角色中处理! - 应用场景:
– 安全代理:屏蔽对真实角色的直接访问。
– 远程代理:通过代理类处理远程方法调用(RMI)
– 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象
静态代理(静态定义代理类)
package com.ujiuye.staticProxy;
/**
* 定义接口,声明方法。
* @author hasee
*
*/
public interface Star {
void confer();//面谈
void signContract();//签合同
void bookTicket();//订票
void sing();//唱歌
void collectMoney();//收钱
}
package com.ujiuye.staticProxy;
/**
* 真是的对象
* @author hasee
*
*/
public class RealStar implements Star {
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void sing() {
System.out.println("RealStar(周杰伦本人).sing()");
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney");
}
}
package com.ujiuye.staticProxy;
/**
* 代理对象
* @author hasee
*
*/
public class ProxyStar implements Star{
private Star star;
public ProxyStar(Star star) {
super();
this.star = star;
}
@Override
public void confer() {
System.out.println("ProxyStar.confer()");
}
@Override
public void signContract() {
System.out.println("ProxyStar.signContract()");
}
@Override
public void bookTicket() {
System.out.println("ProxyStar.bookTicket()");
}
@Override
public void collectMoney() {
System.out.println("ProxyStar.collectMoney()");
}
@Override
public void sing() {
star.sing();
}
}
package com.ujiuye.staticProxy;
/**
* 测试静态代理类
* @author hasee
*
*/
public class Client {
public static void main(String[] args) {
Star real = new RealStar();
Star proxy = new ProxyStar(real);
proxy.bookTicket();
proxy.sing();
}
}