设计模式
1.代理模式
代理模式示意图:

静态代理
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共也就是交给代理角色!实现了业务的分工
- 公共业务发生扩展的时候,方便集中管理
缺点:
-
- 一个真实角色就会产生一个代理角色;代码量会翻倍--开发效率减低!但是在公司中,改别人的代码是大忌!!!
- 一个真实角色就会产生一个代理角色;代码量会翻倍--开发效率减低!但是在公司中,改别人的代码是大忌!!!
例子:
先上使用方法------用户使用
public class Client { public static void main (String[] args) { UserServiceImpl userService =new UserServiceImpl(); UserServiceProxy proxy = new UserServiceProxy(); proxy.setUserServiceImpl(userService); proxy.add(); proxy.delete(); proxy.upadte(); } }
一般用户接口(增删改查)
1 public interface UserService { 2 public void add(); 3 public void upadte(); 4 public void query(); 5 public void delete(); 6 }
实现接口方法
1 public class UserServiceImpl implements UserService { 2 3 4 public void add () { 5 System.out.println("添加"); 6 } 7 8 public void upadte () { 9 System.out.println("更新"); 10 } 11 12 public void query () { 13 System.out.println("查询"); 14 } 15 16 public void delete () { 17 System.out.println("删除"); 18 } 19 }
代理类
1 public class UserServiceProxy implements UserService 2 { 3 private UserServiceImpl userServiceImpl; 4 5 public void setUserServiceImpl (UserServiceImpl userServiceImpl) { 6 this.userServiceImpl = userServiceImpl; 7 } 8 9 public void add () { 10 log(); 11 userServiceImpl.add(); 12 } 13 14 public void upadte () { 15 log(); 16 userServiceImpl.upadte(); 17 } 18 19 public void query () { 20 log(); 21 userServiceImpl.query(); 22 } 23 24 public void delete () { 25 log(); 26 userServiceImpl.delete(); 27 } 28 public void log(){ 29 System.out.println("新加的业务,不能改变原有代码"); 30 } 31 }
动态代理
- 动态代理和静态代理的角色一样
- 动态代理的代理类是动态生成的,不是我们直接写好的
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口的---JDK 动态代理 【常用的】
- 基于类的:cglib
- java字节码实现:javasist
- 这里我们使用的JDK的原生代码实现的,其余的原理都是一样的
核心:InvocationHandler和Proxy
我们也可以编写一个通用的动态代理实现的类!所有的代理对象设置为Object即可!
代码实现:
ProxyInvocationHandler类:
1 public class ProxyInvocationHandler implements InvocationHandler { 2 //此方法通用 3 private Object target; 4 5 public void setTarget (Object target) { 6 this.target = target; 7 } 8 9 //生成得到的代理类,这里只有rent一样,rent是外部接口,这个方法是写死的。 10 public Object getProxy(){ 11 return Proxy.newProxyInstance(this.getClass().getClassLoader(), 12 target.getClass().getInterfaces(),this); 13 } 14 15 //处理代理实例,并返回结果 16 // 动态代理的本质,就是使用反射机制实现! 17 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 18 log(method.getName()); 19 Object result = method.invoke(target, args); 20 return result; 21 } 22 23 //这里可以加方法 24 public void log(String methodName){ 25 System.out.println("执行了"+methodName+"方法"); 26 } 27 28 public void seeHouse(){ 29 System.out.println("看房子。处理程序"); 30 } 31 }
测试
1 public class Client { 2 public static void main(String[] args) { 3 //真实对象 4 UserService userDao =new UserServiceImpl(); 5 //代理对象的调用处理程序 6 ProxyInvocationHandler pih = new ProxyInvocationHandler(); 7 pih.setTarget(userDao); //设置要代理的对象 8 UserService proxy = (UserService) pih.getProxy(); //动态生成代理类! 9 proxy.delete(); 10 } 11 }
动态代理的好处
静态代理有的它都有,静态代理没有的,它也有!
- 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .
- 公共的业务由代理来完成 . 实现了业务的分工 ,
- 公共业务发生扩展时变得更加集中和方便 .
- 一个动态代理 , 一般代理某一类业务
- 一个动态代理可以代理多个类,代理的是接口!

浙公网安备 33010602011771号