代理模式的介绍及搭建

时间:2020-10-27 23:43 作者:songsongsong 阅读数:523

一、代理模式的作用

  把主要业务与次要业务进行松藕合的组装


二、代理模式的本质

  

  例子:

     

    <inpit type="button" onclick="处理函数">   //


  本质:监控行为的特征


三、生活案例:


   饭前便后要洗手 


  1.首先分析出主要业务与次要业务

   

   【主要业务】吃饭  上厕所

   【次要业务】洗手


  2.JDK代理模式的实现

    

   1.接口角色:定义所有需要被监听的行为

   2.接口的实现类:中国人、印度人

   3.通知类:1)对次要业务进行具体的实现  

             2)通知JVM,当前被拦截的主要业务方法与次要业务方法该如何绑定

   4.监控对象(代理对象):

     

     1)被监控的实例对象  2)需要被监控的行为  3)具体通知类实例对象



 **对所有人进行生活监控


 在src下建立接口(Interface)com.**.service  名为BaseService {在此接口只声明需要被监控行为}


 public intreface BassService{

       public void eat();

       public void wc();


}

 

 在src建立com.**.servicempl 名为person的实现类  选择BaseService 接口


   public void eat(){ //主要业务,代理要求开发人员只需关心主要业务

      System.out.println("使用筷子吃饭");

}

  


   public void wc(){

         System.out.println("测试地球引力有没有减弱");

}


   

}

 


   建立一个工具类com.**.util  生成名为Invaction的通知类(要想成为JDK的通知类,那么它必须是InvocationHandler接口的实现类)

选择InvocationHandler接口


声明属性:  public BaseService obj;//具体被监控对象

            public Invaction(BaseService param){

               this.obj = param;

           }


/**

*invoke方法:在被监控行为将要执行时,会被JVM拦截。这时被监控行为和行为实现方会被作为参数输送给invoke

*            主要职责--通知JVM, 这个被拦截方法是怎样与当前的次要业务方法绑定实现

*invoke方法中三个参数

*                

*      阿三.wc(); //JVM拦截

*      wc方法封装为Method 类型对象

*      wc方法在运行时接受所有的实参封装到Object[]

*      将负责监控阿三的代理对象作为invoke 方法的第一个参数Object

**/


  public Object invoke(Object porxy, Method method ,Object[] params) thoes Throwable{

    

    //0.局部变量,接受主要业务方法完成后返回值

      Object value;


    //1.确认被拦截行为

     String methodName = method . getName();


    //2.根据被拦截行为不同,决定主要业务和次要业务怎样绑定

     if ("eat". equals ( methodName)){  //饭前洗手

       wash(); 

                                //洗手

       value = method . invoke ( this. obj , params ); //吃饭


    }else{ //便后洗手


       wash();                                 //洗手


       value = method . invoke ( this. obj , params ); //厕所

    }


   return value; //返回被拦截方法所需调用的地方

}



//次要业务


  public void wash(){

      System.out.println("洗手 ");


}





创建监控对象(代理对象)在util中在建立一个工具类ProxyFactory不需要接口


/*

*

*

*参数:class文件,监控类

*

*

*

**/






   public static BaseService Builder() {  //做成静态节省内存

    //1.创建监控类实例对象

       BaseService obj = (BaseService ) classFile. newInstance();

 

    //2.创建通知对象

        

       InvocationHandler adviser = new Invocaion(obj);


    //3.向JVM申请负责监控obj指定行为的监控对象(代理对象)


       BaseService $Proxy . newProxyInstance (obj.getClass().getclassLosder , obj.getClass().getInterfaces,h)

       return $proxy;     

      //loder: 被监控对象隶属的类文件在内存中的真实位置

     //interfaces:被监控文件隶属的类文件实现接口

     //h:监控对象发现阿三要执行被监控行为,应该有哪一个通知对象进行辅助



}



推荐文章

[推荐] .NET Core 学习资料精选:入门

[推荐] 数据库常见死锁原因及处理

[推荐] C# 设置Excel数据自适应行高、列宽的2种情况 (转)

[推荐] C++ vector 和set结合数字去重练习

[推荐] win7 .net core 部署 The library hostfxr.dll was found, but loading it from C:\<path_to_app>\hostfxr.dll failed

[推荐] JdbcTemplate多数据源使用

[推荐] 深入学习Redis(2):持久化

[推荐] asp.net core系列 67 Web压力测试工具WCAT

[推荐] .Net Core 2.0 获取客户端IP地址

[推荐] 第七天 让你的container实现跨主机访问

[推荐] nodejs app.use(express.static) 静态文件托管 (四)

[推荐] 8天玩转并行开发——第八天 用VS性能向导解剖你的程序

[推荐] C++ 稀疏表的练习

[推荐] C++ Lambda表达式练习

[推荐] Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

[推荐] asp.net core系列 33 EF查询数据 (2)

[推荐] 试试发布

[推荐] C++中 *p++ 到底是 *(p++) 还是 (*p)++ 1. 猜想

[推荐] JavaWeb-Log4j: WARN No appenders could be found for logger

[推荐] C++ 模板练习


评论列表



注册用户登录后才能发表评论,请登录注册,访问 博客首页