<%@ page contentType="text/html; charset=gb2312"%> Java设计模式之计数代理模式
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
Java设计模式之计数代理模式
     发布者: 发布时间:2007-09-23
计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志(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

public interface OrderIF {
public Vector getAllOrders();
}

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

public class Order implements OrderIF {
 public Vector getAllOrders() {
  FileUtil fileUtil = new FileUtil();
  Vector v = fileUtil.fileToVector("orders.txt");
  return v;
 }
}

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

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

Figure3: Order Class Hierarchy with the Counting Proxy

public class OrderProxy implements OrderIF {
 private int counter = 0;
 public Vector getAllOrders() {
  Order order = new Order();
  counter++;
  long t1 = System.currentTimeMillis ();
  Vector v = order.getAllOrders();
  long t2 = System.currentTimeMillis();
  long timeDiff = t2 ? t1;
  String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms";
  //log the message
  FileUtil fileUtil = new FileUtil();
  fileUtil.writeToFile("log.txt”,msg, true, true);
  return v;
 }
}

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

public class MainApp {
 public static void main(String[] args) {
  OrderIF order = new OrderProxy();
  Vector v = order.getAllOrders();
  v = order.getAllOrders();
  v = order.getAllOrders();
  v = order.getAllOrders();
 }
}

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Java IO 包中的Decorator模式
Java IO 包中的Decorator模式
J2EE应用中常见的反模式(anti-patterns)
J2EE应用中常见的反模式(anti-patterns)
JAVA设计模式系列之Adapter(适配器)
JAVA设计模式系列之Adapter(适配器)
 
最近评论:
        
鍥炲
        
那个雨天的想法!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(2442)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(8855)
        
那天的情景!
Maple Story mesos,MapleStory mesos,ms mesos,mesos,SilkRoad Gold, max(3039)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(2193)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(8753)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(8219)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(5561)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(7049)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(7102)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号