摘 要:Java設計模式是對軟件系統(tǒng)設計中常見問題的可復用的經典解決方案。本文討論了兩種Java設計模式:工廠模式和代理模式。設計了一個使用JSP和Servlet技術實現(xiàn)的基于MVC模式的系統(tǒng)架構。并研究了這Java的兩種設計模式在該MVC模式系統(tǒng)中的應用。
關鍵詞:工廠模式;代理模式;MVC模式
中圖分類號:TP311.52
1 Java設計模式
程序的設計模式是開發(fā)人員在開發(fā)當中不斷積累,總結出來的一種可以重用的方案。設計模式建立了一系列描述如何完成軟件開發(fā)領域中特定任務的規(guī)則,設計模式識別并確定類和實例層次上或組件層次上的抽象關系[1]。Java一共有23種設計模式,在此我們討論兩種模式。
1.1 工廠模式
工廠模式顧名思義用來生產產品的模式。在Java語言中,要創(chuàng)建對象常見方法是用new關鍵字,工廠模式從面向對象思想出發(fā),把每次對象的創(chuàng)建看成是一個工廠生產一件產品,即把new類名()替換成工廠類調用生產產品的方法。它涉及到的角色有三種:(1)工廠類角色:是工廠模式的核心,有一定的邏輯。在Java中由具體類實現(xiàn);(2)抽象產品角色:是具體產品繼承的父類或實現(xiàn)的接口。在Java中由接口或抽象類實現(xiàn);(3)具體產品角色:工廠類所創(chuàng)建的對象就是此角色的實例。在Java中由具體類實現(xiàn)。
1.2 代理模式
代理模式指的就是一個角色代表另一個角色采取行動。在某些情況下,一個客戶不想或不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。靈活使用代理模式在實際應用中可以解決許多問題[2]。代理模式一般涉及到的角色有:(1)抽象角色:聲明真實對象和代理對象的共同接口;(2)代理角色:代理對象內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口,在任何時刻都能代替真實對象;(3)真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
代理模式又分靜態(tài)代理和動態(tài)代理,靜態(tài)代理中代理角色的一個接口只能服務于一種類型的類,動態(tài)代理不管真實角色如何變化,代理角色只需一個接口。Java在Java.lang.reflect包中提供了動態(tài)代理類,Java的動態(tài)代理可以勝任大規(guī)模程序。
2 JSP+Servlet技術的MVC模式系統(tǒng)
在JSP和Servlet技術實現(xiàn)的基于MVC模式的B/S系統(tǒng)中,M(Model,模型)由Java類實現(xiàn),V(View,視圖)由JSP實現(xiàn),C(Controller,控制器)由Servlet實現(xiàn)。以登錄功能為例說明MVC模式的系統(tǒng)實現(xiàn)。
首先為登錄的用戶提供一個登錄界面login.jsp,用戶在登錄后,跳轉到LoginServlet中執(zhí)行返回成功或失敗信息。LoginServlet訪問業(yè)務層接口LoginService進行登錄流程的判斷,在該判斷過程中需要通過DAO(Data Access Object,數(shù)據訪問層)接口進行數(shù)據訪問。執(zhí)行過程如圖1所示。
圖1 登錄執(zhí)行過程
3 工廠模式的應用
在上面設計的系統(tǒng)中,V層對C層的請求訪問可以通過JSP頁面的設計和web.xml的配置實現(xiàn),而C層對M層的訪問,以及在M層內部,業(yè)務邏輯類LoginService對LoginDAO的訪問都需要通過定義接口對象訪問。應用工廠模式實現(xiàn)接口對象訪問,首先創(chuàng)建抽象產品角色:數(shù)據訪問接口LoginDAO和業(yè)務邏輯接口LoginService;然后創(chuàng)建具體產品角色:也就是接口的實現(xiàn)類,分別為LoginDAOImpl和LoginServiceImpl,最后,定義工廠類角色:DAOFactory和ServiceFactory,在每次訪問接口時,都通過工廠類生產業(yè)務邏輯類對象和數(shù)據訪問DAO對象。
工廠類中的方法定義為static,使用時可以直接用工廠類調用方法獲得實例對象。數(shù)據訪問類的工廠類DAOFactory具體實現(xiàn)代碼如下:
public class DAOFactory{
public static LoginDAO getLoginDAOInstance(Connection conn)
{return new LoginDAOImpl(conn);}
}
其中Connection為數(shù)據庫連接類,將其對象做形參,可保證一次服務的數(shù)據增、刪、改、查只打開一次數(shù)據連接。
4 動態(tài)代理模式的應用
在軟件系統(tǒng)中經常會有一些功能,如日志、事務管理、安全檢查等是與系統(tǒng)本身的業(yè)務無關的。如果將這些功能加入到原有的程序代碼中會使業(yè)務邏輯變得復雜,這個時候就需要代理機制來實現(xiàn)。使用動態(tài)代理模式實現(xiàn)登錄方法調用前輸出提示信息的日志功能。首先,抽象角色為接口LoginService,有l(wèi)ogin方法完成登錄;具體角色為實現(xiàn)類LoginServiceImpl,調用LoginDAO完成登錄的業(yè)務邏輯。其次使用Java提供的InvocationHandler接口,完成代理角色及代理類的定義。關鍵代碼如下:
public class LogHandler implements InvocationHandler{
……
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
System.out.println(\"輸出的提示信息\");
method.invoke(sub, args);
return 1;
}
}
在代理類中,可任意增加與系統(tǒng)本身業(yè)務邏輯無關的任何代碼,在此,下劃線為日志功能代碼。代理模式相關類定義好后,在調用時需要首先使用工廠類創(chuàng)建業(yè)務層被代理對象lsi,再創(chuàng)建代理對象ls,關鍵代碼如下:
Class cls= lsi.getClass();
LoginService ls=(LoginService)
Proxy.newProxyInstance (cls.getClassLoader(),cls.getInterfaces(),new LogHandler(lsi));
ls.login();
5 結束語
本文討論了Java的工廠模式和代理模式在基于MVC系統(tǒng)中的具體應用,并以登錄功能為例,詳細說明了JSP和Servlet技術搭建的MVC軟件系統(tǒng)的執(zhí)行過程,以及兩種模式在登錄功能實現(xiàn)中的具體應用和關鍵代碼。Java的設計模式,是開發(fā)人員不斷積累經驗的成果,所以在系統(tǒng)開發(fā)中,合理使用設計模式,使代碼具有可重用性,且易于他人理解。
參考文獻:
[1]侯瑞春,高健,劉學義.JAVA設計模式在工作流管理系統(tǒng)中的應用研究[J].微計算機信息,2010.
[2]丁民豆.代理模式的研究與使用[J].電腦知識與技術,2011.
作者簡介:楊新艷(1982-),女,山東青島人,研究生,講師,研究方向:計算機應用技術;蘇愛玲(1979-),女,山東青島人,研究生,講師,研究方向:計算機應用技術。
作者單位:青島工學院,山東青島 266300
基金項目:2013年山東省高??萍加媱澴曰I經費項目(項目編號:J13LN78)。