静态代理模式和动态代理模式
静态代理模式和动态代理模式
一.静态代理模式的理解
要完成租房这件事,定义为接口
//租房这件事
public interface Rent {
public void rent();
}
房东租房
//房东实现租房
public class Host implements Rent {
public void rent() {
System.out.println("我是房东,我要出租房子!");
}
}
代理即相当于中介给房东租房
//找代理即相当于中介来完成租房
public class Proxy implements Rent {
//房东对象
private Host host;
//对房东进行初始化
public Proxy(Host host) {
this.host = host;
}
//代理即中介租房时要做的所有事
public void rent() {
seeFang();
//真正的目的
host.rent();
qianHetong();
fare();
}
public void seeFang(){
System.out.println("看房");
}
public void qianHetong(){
System.out.println("签合同");
}
public void fare(){
System.out.println("收费");
}
}
代理给房东完成租房
public class Client {
public static void main(String[] args) {
//房东要出租房
Host host=new Host();
//代理中介帮房东出租房
Proxy proxy=new Proxy(host);
//代理中介向客户出租房
proxy.rent();
}
}
二.动态代理模式理解
动态代理核心即动态生成代理类
1.仍以房东租房先来理解
租房接口
//租房接口
public interface Rent {
public void rent();
}
房东
//房东
public class Host implements Rent {
public void rent() {
System.out.println("我是房东,我要出租房子");
}
}
动态代理类来生成租房代理类
//用这个类自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
//被代理的接口
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
//生成代理类对象
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}
//处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(rent, args);
return result;
}
}
客户端
public class Client {
public static void main(String[] args) {
Host host=new Host();
ProxyInvocationHandle pih = new ProxyInvocationHandle();
pih.setRent(host);
//生成代理类对象
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
}
2.动态代理模式工具类
dao接口定义要做的事情
public interface UserDao {
public void addUser();
public void deleteUser();
public void updateUser();
public void queryUser();
}
UserService实现接口
public class UserService implements UserDao {
public void addUser() {
System.out.println("增加一个用户");
}
public void deleteUser() {
System.out.println("删除一个用户");
}
public void updateUser() {
System.out.println("更新一个用户");
}
public void queryUser() {
System.out.println("查询一个用户");
}
}
动态代理类工具即可以产生任何一个业务接口的代理类
//用这个类自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
//被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成代理类对象
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//处理代理实例,并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String msg){
System.out.println("执行了"+msg+"方法");
}
}
客户端调用
public class Client {
public static void main(String[] args) {
//真实角色
UserService UserService=new UserService();
//代理角色,不存在
ProxyInvocationHandle pih=new ProxyInvocationHandle();
//设置要代理的对象
pih.setTarget(UserService);
//动态生成代理类
UserDao proxy = (UserDao) pih.getProxy();
proxy.addUser();
}
}
运行结果:


浙公网安备 33010602011771号