码迷,mamicode.com
首页 > 其他好文 > 详细

代理模式

时间:2018-11-04 12:41:15      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:void   get   目标   jdbc   color   nbsp   strong   target   执行   

一、解决何种问题?

  将 “主要业务”和“次要业务”做解耦合处理

二、“主要业务”和“次要业务”的区分

  “主要业务”:要实现的关键性任务

  “次要业务”:起到辅助功能,辅助“主要业务”顺利实现,在项目中,“次要业务”往往大量重复出现。因此大量重复编写“次要业务”往往会影响开发效率

三、以使用JDBC操作数据库为例,来划分“主要业务”和“次要业务”

  1、加载数据库驱动(次要业务)

  2、建立连接(次要业务)

  3、执行sql语句(主要业务)

  4、遍历结果集(次要业务)

  5、关闭资源(次要业务)

四、JDK动态代理

  1、组成

    · 接口:声明需要被监听的行为

    · 代理实现类(实现InvocationHandler接口):将“次要业务”和"主要业务"绑定执行

    · 代理对象:执行“主要业务”

  2、代码示例

    · 创建Interface

1 package com.kkb.jdk.proxy;
2 
3 /**
4  * 声明需要被监听的方法:findByShopId、findByUserId
5  */
6 public interface IOrderDao {
7     Object findByShopId(int shopId);
8     Object findByUserId(int userId);
9 }

     · 创建实现类

 1 package com.kkb.jdk.proxy;
 2 
 3 public class OrderDao implements IOrderDao{
 4     @Override
 5     public Object findByShopId(int shopId) {
 6         System.out.println("执行根据 shopId 查询订单的 sql 语句");
 7         return null;
 8     }
 9 
10     @Override
11     public Object findByUserId(int userId) {
12         System.out.println("执行根据 userId 查询订单的 sql 语句");
13         return null;
14     }
15 }

    · 创建代理实现类

 1 package com.kkb.jdk.proxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 /**
 7  * 代理实现类(实现InvocationHandler接口):用于“主要业务”和“次要业务”绑定执行
 8  */
 9 public class Agent implements InvocationHandler {
10 
11     private Object target;
12 
13     public Agent(Object target){
14         this.target = target;
15     }
16 
17     @Override
18     public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
19         Object returnValue  = null;
20         prePrimaryService();//执行次要业务
21         returnValue  = method.invoke(target,params);//执行主要业务(method:需要执行的目标对象的方法,target:目标对象 params:目标对象的方法所需要的参数)
22         afterPrimaryService();//执行次要业务
23         return returnValue ;
24     }
25 
26     /**
27      * 执行在主要业务之前的次要业务
28      */
29     private void prePrimaryService(){
30         System.out.println("加载数据库驱动");
31         System.out.println("建立连接");
32     }
33 
34     /**
35      * 执行在主要业务之后的次要业务
36      */
37     private void afterPrimaryService(){
38         System.out.println("遍历结果集");
39         System.out.println("关闭资源");
40     }
41 }

    · 创建代理类工厂

 1 package com.kkb.jdk.proxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Proxy;
 5 
 6 /**
 7  * 代理实现类的工厂
 8  */
 9 public class ProxyFactory {
10     public static Object getInstance(IOrderDao orderDao){
11         //将目标对象传给代理实现类
12         InvocationHandler handler = new Agent(orderDao);
13         //ClassLoader loader: 代理对象的字节码文件的地址
14         //Class<?>[] interfaces: 需要监听的接口
15         //InvocationHandler h :代理实现类
16         return Proxy.newProxyInstance(orderDao.getClass().getClassLoader(),orderDao.getClass().getInterfaces(),handler);
17 
18     }
19 }

    · 创建测试类

 1 package com.kkb.jdk.proxy;
 2 
 3 public class Client {
 4     public static void main(String[] args) {
 5         //代理对象
 6         IOrderDao orderDao = new OrderDao();
 7         //代理
 8         IOrderDao proxy = (IOrderDao)ProxyFactory.getInstance(orderDao);
 9 
10         proxy.findByShopId(0);
11         System.out.println("\n----------------------------");
12         proxy.findByUserId(0);
13     }
14 }

    · 打印测试结果

加载数据库驱动
建立连接
执行根据 shopId 查询订单的 sql 语句
遍历结果集
关闭资源

----------------------------
加载数据库驱动
建立连接
执行根据 userId 查询订单的 sql 语句
遍历结果集
关闭资源

 

代理模式

标签:void   get   目标   jdbc   color   nbsp   strong   target   执行   

原文地址:https://www.cnblogs.com/zhangxianming/p/9903288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!