熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java設計模式之計數代理模式

2022-06-13   來源: Java高級技術 

  描述

    計數代理模式在客戶對象調用服務提供者對象上方法的前後執行諸如日志(logging)和計數(counting)一系列附加功能時很有用計數代理模式建議把這些附加功能封裝在一個單獨的對象這個對象就是指計數代理對象而不是把這些附加的功能實現放到服務提供者的內部良好的對象設計的一個特征就是對象要專注於提供特定的功能換句話說理想的對象不應該做各種不相干的事情把諸如日志(logging)和計數(counting)等類似的功能封裝為一個單獨的對象而讓服務提供者對象僅提供它自己的特定功能也就是說只允許服務提供者對象執行定義良好特定的任務

    計數代理被設計成可以被客戶訪問的與服務提供者具有相同接口的對象客戶對象不是直接訪問服務提供者而是調用計數代理對象上的方法計數代理執行必要的紀錄日志(logging)和計數(counting)功能後再把方法調用傳遞給服務提供著對象如圖

  

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

  下面的例子說明了如何在應用程序中利用計數代理

  例子

  讓我們設計一個Order類類層次如圖OrderIF接口聲明了getAllOrders讀取數據庫中所有訂單的簡單方法

  

     Figure: Order Class Hierarchy

public interface OrderIF {

  public Vector getAllOrders();

  }

  作為getAllOrders方法實現的一部分Order類實用了FileUtil工具類從ordertxt文件中讀取訂單項

   public class Order implements OrderIF {

  public Vector getAllOrders() {

  FileUtil fileUtil = new FileUtil();

  Vector v = fileUtilfileToVector(orderstxt);

  return v;

  }

  }

    讓我們假定在調用getAllOrders()時需要把取數據文件所花費的時間和記錄條數要記錄的log日志文件中

  這個附加的功能可以設計一個單獨的OrderProxy類來實現它與真實對象Order一樣實現OrderIF接口這樣保證了OrderProxy對象提供給客戶與真實對象Order一樣的接口如圖

  

     Figure: Order Class Hierarchy with the Counting Proxy

public class OrderProxy implements OrderIF {

  private int counter = ;

  public Vector getAllOrders() {

  Order order = new Order();

  counter++;

  long t = SystemcurrentTimeMillis ();

  Vector v = ordergetAllOrders();

  long t = SystemcurrentTimeMillis();

  long timeDiff = t ? t;

  String msg = Iteration= + counter + ::Time= + timeDiff + ms;

  //log the message

  FileUtil fileUtil = new FileUtil();

  fileUtilwriteToFile(logtxtmsg 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 = ordergetAllOrders();

  v = ordergetAllOrders();

  v = ordergetAllOrders();

  v = ordergetAllOrders();

  }

  }


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27330.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.