代理模式
代理模式的分类:
(1)静态代理
(2)动态代理
静态代理
角色分析:
- 抽象角色:一般使用接口或者抽象类
- 真实角色:被代理的角色
- 代理角色:代理真实角色,会做一些附属操作
- 客户:访问代理对象的人
package proxy;
//抽象角色
public interface IRent {
void rent();
}
package proxy;
//真实角色
public class Host implements IRent{
@Override
public void rent() {
// TODO Auto-generated method stub
System.out.println("房东要出租房子");
}
}
package proxy;
//代理角色
public class Proxy implements IRent {
private Host host;//采用组合
public Proxy() {
}
public Proxy(Host host) {
super();
this.host = host;
}
@Override
public void rent() {
// 代理房东租房
host.rent();
seeHouse();
fare();
}
//代理会有一些附属操作,如:看房,收中介费
public void seeHouse() {
System.out.println("中介带客户看房");
}
public void fare() {
System.out.println("中介收取费用");
}
}
package proxy;
//客户端访问代理角色
public class Client {
public static void main(String[] args) {
//new一个房东
Host host=new Host();
//new一个代理中介
Proxy proxy=new Proxy(host);
proxy.rent();
proxy.fare();
proxy.seeHouse();
}
}
静态代理的缺点:一个真实角色就会产生一个代理角色。
动态代理:(使用反射机制实现)
动态代理和静态代理角色相同。
动态代理的代理类是自动生成的,不是我们直接写好的。
动态代理分为两类:基于接口(jdk底层);基于类。
需要了解两个类:
- Proxy:(java.lang.reflect)提供了创建动态代理类和实例的静态方法
- InvocationHandler: (java.lang.reflect)每个代理实例都有一个关联的调用处理程序,当代理实例调用方法时,方法调用将被自动分配到调用处理程序的invoke方法。
代理模式的应用:
- 远程代理:开发中,经常会有本地服务完成不了的功能,需要访问远程服务中的对象。大使(ambassador)远程代理的角色,就像一个国家在另一个国家的大使一样,重大问题还是要跟国内沟通。
- 虚拟代理:可在加载的过程中加以必要优化。对开销很大的对象,只有在使用它时,才创建(节省内存空间)。
- 保护代理:(安全代理)运行时,对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理对象。
- 智能引用代理:当一个对象被引用时,提供一些额外操作。如:记录对对象的调用次数。