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

2016-02-19 13:41 4 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享Java设计模式之计数代理模式,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

描述:
  
  计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志(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();
   }
  }进入讨论组讨论。

来源:http://www.tulaoshi.com/n/20160219/1604964.html

延伸阅读
创建型模式 FACTORY?人才市场:以往是要哪个人才,就找哪个人才,效率低,现在有了人才市场,我们只需 直接去人才市场挑一个好了; BUILDER?生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一步组装做,好 比有了工业革命,现在都由生产流水线代替了。如要造丰田汽车,先制定汽车的构造如由车胎、...
Flyweight定义: 避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用? 面向对象语言的原则就是一切都是对象,但是假如真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,假如以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找...
标签: Java JAVA基础
一:介绍 记得初学jsp的时候,总喜欢把他和asp,php去比较,也习惯于使用asp的开发模式去写jsp后来才发现这真是很傻的做法,其实jsp一出了来就已经用MVC模式了。下面我就简要说说jsp设计使用MVC来设计。 二:MVC介绍 MVC其实是模、视图、控制的缩写,也就是说在使用jsp时,有相应的文件去实现相应的操作 通常jsp只负责v...
标签: Web开发
一直以来都想把在实际开发中的一些经验系统地整理一下,共享出来给一些有志于深入B/S开发的朋友,趁着国庆忙里偷闲,先试验性的写一下有关于Javascript开发中的比较有用的东西。 设计模式一直以来都是在面向对象的语言,或比较正规化的开发中才会出现的一门程序设计思想。一直以来众多的前端开发者认为使用OO方式来写JS更像是一个程序...
标签: PHP
转自:http://www.cnblogs.com/team/DesignPattern.html 1、 FACTORY 一追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德基就是生产鸡翅的Factory     工厂模式 :客户类和工厂类分开。消费...

经验教程

729

收藏

46
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部