1. 核心作用
为其他对象提供一种代理,并以控制对这个对象的访问。
2. 模式的组成
1)抽象角色(Subject):
定义真实角色RealSubject 和 抽象角色Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。代理主题通过持有真实主题RealSubject的引用,不但可以控制真实主题RealSubject的创建或删除,可以在真实主题RealSubject被调用前进行拦截,或在调用后进行某些操作。
2)代理角色(Proxy):
. 保存一个引用使得代理可以访问实体。若 RealSubject和Subject的接口相同,Proxy会引用Subject。
. 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
. 控制对实体的存取,并可能负责创建和删除它。
3) 真实角色(RealSubject):定义了代理角色(proxy)所代表的具体对象。
3. 代理模式的缺点:
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
4. 应用场景:
安全代理
远程代理
延时加载
控制访问
5. 分类:
静态代理:静态定义代理类
动态代理:动态生成代理类
JDK自带的动态代理
javaassist字节码操作库实现
CGLIB
ASM(底层使用指令,可维护性较差)
6. 静态代理的实现
import java.lang.reflect.Proxy;
/*
* 静态加载
*/
interface Star{
//面试
void confer();
//签合同
void singnContract();
//订票
void bookTicket();
//唱歌
void sing();
//收钱
void collectMoney();
}
class RealStar implements Star{
@Override
public void confer() {
System.out.println("工资面谈");
}
@Override
public void singnContract() {
System.out.println("签订合同");
}
@Override
public void bookTicket() {
System.out.println("订票");
}
@Override
public void sing() {
System.out.println("唱歌");
}
@Override
public void collectMoney() {
System.out.println("给钱给钱");
}
}
class ProxyStar implements Star{
private Star star;
public ProxyStar(Star star){
this.star = star;
}
@Override
public void confer() {
System.out.println("我代替明星谈工资");
}
@Override
public void singnContract() {
System.out.println("我代替明星填合同");
}
@Override
public void bookTicket() {
System.out.println("我代替明细订票");
}
@Override
public void sing() {
System.out.println("明星唱歌");
System.out.println("我只是一个代理");
System.out.println(star.toString()+":");
star.sing();
}
@Override
public void collectMoney() {
System.out.println("我代替明星收钱");
}
}
public class StaticProxy {
public static void main(String[] args) {
RealStar star = new RealStar();
ProxyStar proxy = new ProxyStar(star);
proxy.confer();
proxy.singnContract();
proxy.bookTicket();
proxy.sing();
}
}
7. 动态代理
package Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Star{
//面试
void confer();
//唱歌
void sing(int a);
//签合同
void singnContract();
//订票
void bookTicket();
//收钱
void collectMoney();
}
class RealStar implements Star{
public RealStar(int a){
}
@Override
public void confer() {
System.out.println("工资面谈");
}
@Override
public void singnContract() {
System.out.println("签订合同");
}
@Override
public void bookTicket() {
System.out.println("订票");
}
@Override
public void sing(int a) {
if(a == 1)
System.out.println("我在唱歌");
else
System.out.println("我不唱歌");
}
@Override
public void collectMoney() {
System.out.println("给钱给钱");
}
}
class StarHandler implements InvocationHandler{
Star star;
public StarHandler(Star star) {
this.star = star;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//此处的参数args为调用方法时传递的参数,为对象数组,可通过增强for循环遍历
method.invoke(star, args);
return null;
}
}
public class proxy {
public static void main(String[] args) {
Star star = new RealStar(5);
StarHandler handler = new StarHandler(star);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class},handler);
proxy.sing(2);
}
}