为什么要学习代理模式,因为这就是SpringAOP的底层!【SpringAOP和SpringMVC】 代理模式的分类:
静态代理动态代理角色分析
抽象角色:一般会使用接口或者抽象类来解决真实角色:被代理的角色代理角色:代理真实角色,一般会做一些附属操作客户:访问代理对象的人代码步骤 1.接口
public interface Rent { public void rent(); }2.真实角色
//房东 public class Host implements Rent{ public void rent() { System.out.println("房东要出租房子"); } }3.代理角色
package com.zhao.demo01; public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent() { host.rent(); fee(); } public void seeHouse(){ System.out.println("中介带你看房"); } public void fee(){ System.out.println("收取中介费"); } }4.客户端访问代理角色
package com.zhao.demo01; public class Client { public static void main(String[] args) { //房东要出租房子 Host host = new Host(); //代理,中介帮房东租房子 Proxy proxy = new Proxy(host); //,不用面对房东,直接找中介租房子 proxy.rent(); } }代理模式的好处
可以使真实角色的操作更加纯粹,不用去关注一些公共业务公共业务交给代理角色,实现了业务的分工公共业务扩展的时候,方便集中管理缺点
一个真实的角色就会产生一个代理对象;代码量会翻倍,开发效率变低加深理解 1.接口
package com.zhao.demo02; public interface UserService { public void add(); public void delete(); public void update(); public void query(); }2.真实角色
package com.zhao.demo02; //真实对象 public class UserServiceImpl implements UserService { public void add() { System.out.println("增加了一个用户"); } public void delete() { System.out.println("删除了一个用户"); } public void update() { System.out.println("修改了一个用户"); } public void query() { System.out.println("查询了一个用户"); } }3.代理角色
package com.zhao.demo02; public class UserServiceProxy implements UserService { private UserServiceImpl userService; public void setUserService(UserServiceImpl userService) { this.userService = userService; } public void add() { log("add"); userService.add(); } public void delete() { log("delete"); userService.delete(); } public void update() { log("update"); userService.update(); } public void query() { log("query"); userService.query(); } //日志方法 public void log(String msg){ System.out.println("使用了"+msg+"方法"); } }4.客户端访问代理角色
package com.zhao.demo02; public class Client { public static void main(String[] args) { UserServiceImpl userService = new UserServiceImpl(); UserServiceProxy proxy = new UserServiceProxy(); proxy.setUserService(userService); proxy.query(); } }需要了解两个类:Proxy:代理,InvocationHandler:调用处理程序
1.接口
package com.zhao.demo03; public interface Rent { public void rent(); }2.真实对象
package com.zhao.demo03; //房东 public class Host implements Rent { public void rent() { System.out.println("房东要出租房子"); } }3.动态代理
package com.zhao.demo03; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //用这个类,自动生成代理类 public class ProxyInvocationHandler 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 { seeHouse(); //动态代理的本质,就是使用反射机制实现 Object result = method.invoke(rent, args); return result; } public void seeHouse(){ System.out.println("中介带看房子"); } }4.客户端访问动态代理
package com.zhao.demo03; public class Client { public static void main(String[] args) { //真实角色 Host host = new Host(); //代理角色:现在没有 ProxyInvocationHandler pih = new ProxyInvocationHandler(); //通过调用程序处理角色来处理我们要调用的接口对象 pih.setRent(host); Rent proxy = (Rent) pih.getProxy();//这里的proxy就是动态生成的 proxy.rent(); } }代理模式的好处
可以使真实角色的操作更加纯粹,不用去关注一些公共业务公共业务交给代理角色,实现了业务的分工公共业务扩展的时候,方便集中管理一个动态代理类代理的是一个接口,一般就是对应的一类业务一个动态代理类可以代理多个类,只要实现了同一个接口即可