简介
在完成原有功能的情况下额外做一些事,就像中介租房子一样
代理模式分为静态代理和动态代理
静态代理需要为每一个需要被代理的类写一个代理类
动态代理,只需要写一个类就可以进行代理
主要模块
- 抽象主题
- 真实主题
- 代理对象
例子-静态代理
抽象主题
//租房子接口
public interface RentHouse {
//租房
void rent();
}
真实主题
public class User implements RentHouse {
@Override
public void rent() {
System.out.println("租到房子");
}
}
代理对象
//中介
public class ProxyUser implements RentHouse{
//真实对象
private RentHouse rentHouse;
public ProxyUser() {
//初始化真实对象,用户感知不到
this.rentHouse = rentHouse = new User();
}
@Override
public void rent() {
//代理需要做的事
System.out.println("我是一个中介。。。。。。。。。。");
//本来需要做的事
rentHouse.rent();
}
}
测试
//静态代理
public class Main {
public static void main(String[] args) {
//不适用代理的情况
User user = new User();
user.rent();//租到房子
//使用代理的情况,用户不知道被谁代理了
ProxyUser proxyUser = new ProxyUser();
proxyUser.rent();//我是一个中介。。。。。。。。。。
//租到房子
}
}
例子-动态代理
代理对象
//动态代理
public class DynamicProxy implements InvocationHandler {
//真实对象
private Object subject;
public DynamicProxy(Object subject)
{
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是中介,租房之前。。。");
//真实对象操作
method.invoke(subject, args);
System.out.println("我是中介,租房之后。。。");
return null;
}
}
测试
//使用动态代理
public class DynamicMain {
public static void main(String[] args) {
//不适用代理
User user = new User();
//创建代理对象
InvocationHandler handler = new DynamicProxy(user);
RentHouse subject = (RentHouse) Proxy.newProxyInstance(
//创建代理对象的类加载去
handler.getClass().getClassLoader(),
//接口
user.getClass().getInterfaces(),
//代理对象
handler);
//执行
subject.rent();
// 我是中介,租房之前。。。
// 租到房子
// 我是中介,租房之后。。。
}
}