设计模式

1.代理模式

  代理模式示意图:

  

 

 

 

  静态代理  

   代理模式的好处:

  1.     可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
  2.                公共也就是交给代理角色!实现了业务的分工
  3.                公共业务发生扩展的时候,方便集中管理  

          缺点:

    •       一个真实角色就会产生一个代理角色;代码量会翻倍--开发效率减低!但是在公司中,改别人的代码是大忌!!!

  例子:

  先上使用方法------用户使用

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 }

动态代理的好处

静态代理有的它都有,静态代理没有的,它也有!

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情 .
  • 公共的业务由代理来完成 . 实现了业务的分工 ,
  • 公共业务发生扩展时变得更加集中和方便 .
  • 一个动态代理 , 一般代理某一类业务
  • 一个动态代理可以代理多个类,代理的是接口!

 

posted @ 2020-02-01 10:42  Hugo_nice  阅读(155)  评论(0)    收藏  举报