代理模式

静态代理

理论

1.Subject(抽象主题类):
抽象类或者接口,主要负责声明真实主题和代理的共同接口方法
2.RealSubject(真实主题类):
也叫被委托类或被代理类,继承抽象主题类或是实现抽象主题类接口,负责定义抽象主题类声明的方法的具体内容
3.ProxySubject(代理类):
也叫委托类或代理类,继承抽象主题类或是实现抽象主题类接口,该类有一个对真实主题的引用,负责在实现的方法中直接调用真实主题类的方法
4.Client:客户类:
使用代理的类

例子

Subject(抽象主题类):

1
2
3
public interface Subject {
void outPut();
}

RealSubject(真实主题类):

1
2
3
4
5
6
7
8
public class RealSubject implements Subject {
@Override
public void outPut() {
// TODO Auto-generated method stub
System.out.println("这就是静态代理");
}
}

ProxySubject(代理类):

1
2
3
4
5
6
7
8
9
10
11
public class ProxySubject implements Subject {
private Subject mSubject;
public ProxySubject(Subject subject){
this.mSubject=subject;
}
@Override
public void outPut() {
// TODO Auto-generated method stub
mSubject.outPut();
}
}

Client:客户类:

1
2
3
4
5
6
7
public class Client {
public static void main(String[] args) {
Subject realSubject=new RealSubject();
Subject proxySubject=new ProxySubject(realSubject);
proxySubject.outPut();
}
}

结果

动态代理

理论

动态代理通过java的反射机制来动态生成代理者的对象。
1.Subject(抽象主题类):
接口,主要负责声明真实主题和代理的共同接口方法
2.RealSubject(真实主题类):
也叫被委托类或被代理类,实现抽象主题类接口,负责定义抽象主题类声明的方法的具体内容
3.ProxySubject(代理类):
也叫委托类或代理类,负责实现jdk的InvocationHandler接口invoke方法现动态代理
4.Client:客户类:
使用代理的类

例子

Subject(抽象主题类):

1
2
3
public interface Subject {
void outPut();
}

RealSubject(真实主题类):

1
2
3
4
5
6
7
8
public class RealSubject implements Subject {
@Override
public void outPut() {
// TODO Auto-generated method stub
System.out.println("这就是动态代理");
}
}

ProxySubject(代理类):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxySubject implements InvocationHandler {
private Object obj;//真实对象的引用
public ProxySubject(Object obj){
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("开始调用真实主题类方法");
Object result=method.invoke(obj, args);//调用真实主题类方法
System.out.println("调用真实主题类方法结束");
return result;
}
}

Client:客户类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Subject realSubject=new RealSubject();
//构造一个动态代理
ProxySubject proxySubject= new ProxySubject(realSubject);
//获取真实主题的ClassLoader
ClassLoader loader=realSubject.getClass().getClassLoader();
//动态构造一个代理对象
Subject realSubjectProxy=(Subject)Proxy.newProxyInstance(loader, new Class[]{Subject.class}, proxySubject);
realSubjectProxy.outPut();
}
}

结果