Java设计模式之计数代理模式

请叫我小刘帅锅

请叫我小刘帅锅

2016-02-19 13:41

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享Java设计模式之计数代理模式,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。
描述:
  
  计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志(logging)和计数(counting)一系列附加功能时很有用。 !-- frame contents -- !-- /frame contents -- 计数代理模式建议把这些附加功能封装在一个单独的对象,这个对象就是指计数代理对象,而不是把这些附加的功能实现放到服务提供者的内部。良好的对象设计的一个特征就是对象要专注于提供特定的功能。换句话说,理想的对象不应该做各种不相干的事情。把诸如日志(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();
   }
  }进入讨论组讨论。
展开更多 50%)
分享

猜你喜欢

Java设计模式之计数代理模式

编程语言 网络编程
Java设计模式之计数代理模式

基于Java的代理设计模式

Java JAVA基础
基于Java的代理设计模式

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

代理角色java设计模式之静态代理详细介绍

编程语言 网络编程
代理角色java设计模式之静态代理详细介绍

代理模式之Java动态代理实现方法

编程语言 网络编程
代理模式之Java动态代理实现方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入浅出基于Java的代理设计模式

编程语言 网络编程
深入浅出基于Java的代理设计模式

Java模式设计之数据访问对象模式

编程语言 网络编程
Java模式设计之数据访问对象模式

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在Word2010中将公式保存到公式库

在Word2010中将公式保存到公式库

用Java实现回调例程

用Java实现回调例程
下拉加载更多内容 ↓