<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-20  評論-3  文章-9  trackbacks-0
    隨著軟件分層設計的流行及廣泛的應用,對于DAO的設計模式大家已經不再陌生了,DAO層已經在軟件系統的開發中成為必不可少的一層,將后臺的數據層和前臺的VO進行分離。前段時間也針對于DAO的設計介紹過一個基于Hibernate的泛型DAO的設計。
    csdn blog:http://blog.csdn.net/yongtree/archive/2008/03/12/2172071.aspx
    javaeye blog:http://yongtree.javaeye.com/blog/170449

    通過DAO的設計的確可以讓我們的軟件系統已經將數據層和表現層進行了簡單的分離,讓我們系統各層次的功能更加的清晰。所以我們開始洋洋得意了,DAO的引入讓系統的耦合性更加的松散,表現層再也不需要關心后臺數據操作的變化了。于是我們開始高枕無憂了,我們肆無忌憚的在表現層通過調用DAO來實現我們的系統了。事實真的如此嗎?那我們就舉個例子來看看我們的系統是否真的具有解偶的能力了。
    現在我們有個員工管理系統,在該系統中,Person.java表示員工這個對象,它對應著數據庫中的person表。還有用于操作Person對象的DAO接口—PersonDAO.java,還有一個PersonDAO的實現類PersonDAOImpl.java。在PersonDAOImpl.java中我們實現了操作Person對象的所有的方法。我們很自豪的說,看我們已經把操作封裝在PersonDAO中了,現在我們可以在表現層(jsp,或者VO操作類中)使用PersonDAO personDAO=new PersonDAOImpl()來調用DAO操作我們的數據對象了。當我們陶醉于自己寫的優美的代碼的時候,項目經理來通知了,由于使用Hibernate的效率偏低,客戶開始不滿了,還是讓我們重新用JDBC再重寫一遍吧。于是所有DAO的Hibernate實現開始全部轉換成JDBC實現。但是項目經理建議不要破壞現有的Hibernate實現,以后可以通過技術研究來提升Hibernate的訪問效率。于是我們開始寫了又寫了一套JDBC的實現—PersonDAOJDBCImpl.java,現在問題出來了,表現層大量的使用了PersonDAO personDAO=new PersonDAOImpl(),全部改成new PersonDAOJDBCImpl()談何容易,我們是不是開始欲哭無淚了。
    怎么解決類似的問題呢?于是我們開始引進工廠模式。我們建立一個類DaoFactory.java對DAO進行統一管理。
    DaoFactory.java:
    public class DaoFactory{
    public static PersonDAO getPersonDAOInstance()
    {
    return new PersonDAOImpl() ;
    }
    //得到其他的DAO實例
    ……
    }
    表現層通過PersonDAO personDAO=DaoFactory.get getPersonDAOInstance();來實例化DAO實例。這樣問題就解決了,DAO改變了,我們只需要在DAO工廠類中修改一下代碼:return new PersonDAOJDBCImpl() ;那我們的應用就快速切換到JDBC實現了。可見利用工廠模式,我們的系統又進一步的解耦,表現層真的無需再關系DAO層的變化了,一切交給DAO工廠來解決。
    使用過Spring這樣框架的開發人員都知道,Spring通過利用IoC來實現類之間的解耦。其實在DAO工廠中我們也可以簡單的借鑒一下IoC的思想,更進一步解除類之間的耦合。Spring是通過配置xml文件來進行IoC的,那么我們也可以借助于xml文件來實現。比如下面的xml:
    <?xml version="1.0"?>
    <config>
    <daos>
    <!-- 組織機構服務接口實現類 -->
    <dao id="organizationService"
    type="com.baiyyy.oa.services.organization.OrganizationServiceImpl">
    </dao>
    <!-- 工作流參與者接口 -->
    <dao id="participantService"
    type="com.baiyyy.workflow.services.impl.ParticipantServiceImpl">
    </dao>
    <!-- 工作流定義接口 -->
    <dao id="processDefinitionService"
    type="com.baiyyy.workflow.services.impl.ProcessDefinitionServiceImpl">
    </dao>
    <!-- 工作流實例接口 -->
    <dao id="processInstanceService"
    type="com.baiyyy.workflow.services.impl.ProcessInstanceServiceImpl">
    </dao>
    </daos>
    </config>
    這是我設計實現的工作流系統給業務系統提供的接口所配置的xml,所有的接口都配置在xml中,我們怎么使用呢?我只不過是把DAO工廠進行進一步的改進,通過ProcessInstanceService processInstanceService=DaoFactory.getDao(ProcessInstanceService.class,” processInstanceService”);從傳入的參數我們可以看出,我們清楚的知道要調用的接口ProcessInstanceService,同時通過字符串” processInstanceService”,我們可以解析上面的配置文件,得到具體實現類的路徑,通過反射得到該實現類的實例。具體的DAO工廠類的實現,朋友們有興趣可以自己去實現,我就不詳細介紹了。
    終于寫完了,以上便是對DAO工廠一些淺顯的理解。現在正在學習設計模式,以后會根據自己的所學所思,介紹自己對各個設計模式的理解,希望大家一塊學習討論。

    posted on 2008-06-04 15:17 藍山 閱讀(278) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 色片在线免费观看| 2020久久精品国产免费| 免费在线黄色网址| 久久久久久亚洲av无码蜜芽| 国内精品乱码卡1卡2卡3免费| 亚洲国产成人久久99精品| 精品国产sm捆绑最大网免费站| 91久久亚洲国产成人精品性色 | 亚洲午夜成人精品电影在线观看| 亚洲av永久无码一区二区三区| 日韩a在线观看免费观看| 亚洲AV无码专区国产乱码不卡| 四虎永久在线精品免费观看地址| 日韩大片在线永久免费观看网站| 77777亚洲午夜久久多人| 国产情侣久久久久aⅴ免费 | 亚洲成a人片在线观看日本麻豆| 福利片免费一区二区三区| 亚洲午夜爱爱香蕉片| 成全视频免费观看在线看| 亚洲人成网站影音先锋播放| 亚洲免费视频网址| 亚洲成av人在线观看网站| 亚洲一级特黄大片无码毛片| 麻豆精品成人免费国产片| 亚洲AV无码国产精品色| 国产a不卡片精品免费观看| 国产精品1024在线永久免费 | 99久久免费国产精品热| 亚洲免费在线播放| 麻豆国产入口在线观看免费| 免费无码一区二区| 午夜影视日本亚洲欧洲精品一区| 免费影院未满十八勿进网站| 精品一区二区三区免费毛片| 亚洲高清视频在线观看| 超pen个人视频国产免费观看| 99免费精品视频| 久久久久亚洲国产| 国产av无码专区亚洲av桃花庵| 毛片高清视频在线看免费观看|