java Source

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            14 Posts :: 24 Stories :: 8 Comments :: 0 Trackbacks
          描述:

            計數代理模式在客戶對象調用服務提供者對象上方法的前后執行諸如日志(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();
           }
          }
          posted on 2005-11-15 14:25 JustinLei 閱讀(365) 評論(1)  編輯  收藏 所屬分類: Java

          Feedback

          # re: Java設計模式之計數代理模式 2014-06-15 00:06 LeoCook
          什么時候更新點新的呀  回復  更多評論
            

          主站蜘蛛池模板: 吉水县| 绥芬河市| 开鲁县| 汉中市| 石林| 澄城县| 右玉县| 库尔勒市| 泗洪县| 文水县| 四川省| 孟连| 汉川市| 合作市| 通城县| 宣化县| 泰安市| 开阳县| 寻甸| 那坡县| 六盘水市| 靖州| 澜沧| 奈曼旗| 台北市| 云龙县| 蒙自县| 沅江市| 中江县| 滨海县| 唐海县| 响水县| 伊通| 永春县| 抚宁县| 三明市| 舟曲县| 双鸭山市| 崇州市| 威宁| 余江县|