求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
Java设计模式之计数代理模式
 

2010-04-28 来源:网络

 

计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志(logging)和计数(counting)一系列附加功能时很有用。计数代理模式建议把这些附加功能封装在一个单独的对象,这个对象就是指计数代理对象,而不是把这些附加的功能实现放到服务提供者的内部。良好的对象设计的一个特征就是对象要专注于提供特定的功能。换句话说,理想的对象不应该做各种不相干的事情。把诸如日志(logging)和计数(counting)等类似的功能封装为一个单独的对象,而让服务提供者对象仅提供它自己的特定功能。也就是说,只允许服务提供者对象执行定义良好、特定的任务。

计数代理被设计成可以被客户访问的与服务提供者具有相同接口的对象。客户对象不是直接访问服务提供者,而是调用计数代理对象上的方法,计数代理执行必要的纪录日志(logging)和计数(counting)功能后,再把方法调用传递给服务提供着对象。如图1

Figure1: Generic Class Association When the Counting Proxy Pattern Is Applied

下面的例子说明了如何在应用程序中利用计数代理。

例子:

让我们设计一个Order类,类层次如图2,OrderIF接口声明了getAllOrders读取数据库中所有订单的简单方法。

Figure2: Order Class Hierarchy

1 public interface OrderIF {
2
3   public Vector getAllOrders();
4
5   }
6

作为getAllOrders方法实现的一部分,Order类实用了FileUtil工具类从order.txt文件中读取订单项。

1 public class Order implements OrderIF {
2
3   public Vector getAllOrders() {
4
5   FileUtil fileUtil = new FileUtil();
6
7   Vector v = fileUtil.fileToVector("orders.txt");
8
9   return v;
10
11   }
12
13   }
14

让我们假定在调用getAllOrders()时,需要把取数据文件所花费的时间和记录条数要记录的log日志文件中。

这个附加的功能可以设计一个单独的OrderProxy类来实现,它与真实对象Order一样实现OrderIF接口。这样保证了OrderProxy对象提供给客户与真实对象Order一样的接口。如图3

Figure3: Order Class Hierarchy with the Counting Proxy

1 public class OrderProxy implements OrderIF {
2
3   private int counter = 0;
4
5   public Vector getAllOrders() {
6
7   Order order = new Order();
8
9   counter++;
10
11   long t1 = System.currentTimeMillis ();
12
13   Vector v = order.getAllOrders();
14
15   long t2 = System.currentTimeMillis();
16
17   long timeDiff = t2 ? t1;
18
19   String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms";
20
21   //log the message
22
23   FileUtil fileUtil = new FileUtil();
24
25   fileUtil.writeToFile("log.txt”,msg, true, true);
26
27   return v;
28
29   }
30
31   }
32
33

客户对象MainApp就想调用真实对象Order一样调用OrderProxy对象上的getAllOrders()方法,OrderProxy对象传递这个调用给真实对象Order,计算读取所有订单所花费的时间并使用FileUtil帮助类将其纪录的log日志文件中。在这个过程中,OrderProxy扮演者计数代理的角色。

1 public class MainApp {
2  public static void main(String[] args) {
3   OrderIF order = new OrderProxy();
4   Vector v = order.getAllOrders();
5   v = order.getAllOrders();
6   v = order.getAllOrders();
7   v = order.getAllOrders();
8  }
9 }


Java 中的中文编码问题
Java基础知识的三十个经典问答
玩转 Java Web 应用开发
使用Spring更好地处理Struts
用Eclipse开发iPhone Web应用
插件系统框架分析
更多...   


Struts+Spring+Hibernate
基于J2EE的Web 2.0应用开发
J2EE设计模式和性能调优
Java EE 5企业级架构设计
Java单元测试方法与技术
Java编程方法与技术


Struts+Spring+Hibernate/EJB+性能优化
华夏基金 ActiveMQ 原理与管理
某民航公司 Java基础编程到应用开发
某风电公司 Java 应用开发平台与迁移
日照港 J2EE应用开发技术框架与实践
某跨国公司 工作流管理JBPM
东方航空公司 高级J2EE及其前沿技术
更多...