概述
真实角色,代理角色;真实角色和代理角色要实现同一个接口,代理角色要持有真实角色的引用。创建真实角色的对象和代理角色的对象,并将真实角色对象的引用传给代理角色(可以通过构造参数传递,spring推荐用set注入),让代理角色去执行功能。
代理者替真实角色做不常做的事或不会做的,真实角色更专注做核心事,实现业务分工;
容易扩展,不改变原来代码,真实对象做原来功能,代理去做扩展功能。
一个真实角色一个代理,开发效率变低
示例
//接口
interface Proxy {
void todo() ;
}
// 真实角色
class RealityRole implements Proxy {
@Override
public void todo() {
System.out.println("真实角色的功能");
}
}
// 代理角色
class ProxyRole implements Proxy {
// 持有代理角色的引用
private Proxy realityRole;
public ProxyRole() {
}
//传入一个真实角色
public ProxyRole(Proxy role) {
realityRole = role;
}
@Override
public void todo() {
//在真实角色功能运行之前,代理角色做准备工作
doBefore();
//执行真实角色的功能
realityRole.todo();
//代理角色的收尾工作
doAfter();
}
private void doBefore() {
System.out.println("准备工作");
}
private void doAfter() {
System.out.println("收尾工作");
}
}
多线程中静态代理
在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口,Thread类也实现了Runalbe接口,在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()方法,调用自定义线程对象的run()方法。实现了线程的并发执行
1 public class Test2 {
2
3 public static void main(String[] args) {
4 //Runnable实现类对象,真实角色
5 Thread1 role1 = new Thread1();
6 //线程类代理角色,该类也实现了Runnable接口,代理角色
7 Thread thread1 = new Thread(role1);//传入了真实角色的引用
8
9 thread1.start();
10
11 }
12 }
13
14 class Thread1 implements Runnable {
15
16 @Override
17 public void run() {
18 //TODO
19 }
20
21 }