0%

设计模式之代理模式

什么是代理模式

代理模式(委托模式)就是:为其他对象提供一种代理以控制对这个对象的访问。

UML图

代理模式简单代码实现

代理主题接口

1
2
3
4
5
6
7
/**
* @author iisheng
* @date 2019/10/12 23:21:23
*/
public interface Subject {
void visit();
}

真正的主题类

1
2
3
4
5
6
7
8
9
10
11
/**
* @author iisheng
* @date 2019/10/12 23:21:41
*/
public class RealSubject implements Subject {

@Override
public void visit() {
System.out.println("Real Subject!");
}
}

代理主题类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @author iisheng
* @date 2019/10/12 23:22:21
*/
public class ProxySubject implements Subject {
private RealSubject subject;

public ProxySubject(RealSubject subject) {
this.subject = subject;
}

@Override
public void visit() {
subject.visit();
}
}

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @author iisheng
* @date 2019/10/12 23:23:27
*/
public class Client {

public static void main(String[] args) {
// 构造一个真实的主题对象
RealSubject real = new RealSubject();

// 通过真实主题对象构造一个代理对象
ProxySubject proxy = new ProxySubject(real);

// 调用代理的相关方法
proxy.visit();
}
}

什么是动态代理

代理模式大致可以分为两大部分,一是静态代理,二是动态代理。

  • 静态代理:代理者的代码提前已经写好了,然后再对其进行编译。也就是说在代码运行前,class编译文件就已经存在。
  • 与静态代理相反,代码执行前我们并不知道要代理谁,而是通过反射机制在运行时动态的生成代理者的对象。

Java中动态代理代码实现

实现InvocationHandler接口,重写invoke()方法。

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @author iisheng
* @date 2019/10/12 23:37:40
*/
public class DynamicProxy implements InvocationHandler {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(proxy, args);
return result;
}
}

Java实现动态代理的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @author iisheng
* @date 2019/10/12 23:40:50
*/
public class DynamicProxyClient {
public static void main(String[] args) {
// 构造真实的对象
RealSubject realSubject = new RealSubject();

// 构造一个动态代理
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);

// 获取真实对象的lassLoader
ClassLoader classLoader = realSubject.getClass().getClassLoader();

// 动态构造一个 代理对象
Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy);
subject.visit();
}
}
iisheng wechat
微信扫码关注 Coder阿胜