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

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

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

    posts - 66,  comments - 11,  trackbacks - 0
        DAO模式實際是2個模式的組合,即Data Accessor和Domain Object模式
        Data Accessor即將數據訪問的實現機制加以封裝,與數據的使用代碼相分離,從外部來看,Data Accessor提供了黒盒式的數據存取接口。Domain Object則提供了對所有面向領域內對象的封裝。
       
        DAO模式實現了業務邏輯與數據邏輯的分離。對于專項開發而言,這樣的分離設計差不多已經可以實現開發過程中業務層面和數據層面的相對獨立,并且在實現復雜性與結構清晰性上達到較好的平衡。
        對于一個產品化的業務系統而言,軟件產品往往需要在不同客戶環境下即時部署。由于java良好的跨平臺支持,我們在操作系統之間大可以輕易遷移,但在另外一個層面,數據庫層,卻仍然面臨著平臺遷移的窘境。針對不同的數據庫,我們可以實現針對不同類型數據庫的Data Accessor,并根據客戶實際部署環境,通過類文件的靜態替換來實現。這樣將大大增加部署和維護工作的難度和復雜性。我們應該將此類因素帶來的變動屏蔽在系統之外。

        Factory模式在這里起到連接接口和實現的橋梁作用,通過Factory模式,我們可以根據具體需要加載相應的實現,并將此實現作為所對應接口的一個實例提供給業務層使用:
       
        為了提高性能,避免每次調用都讀取配置文件所引起的大量磁盤操作,采用了HashMap作為DAO緩存實現示例:
      
    public class DAOFactory{
          
    private static HashMap daoMap = null;
          
    public static Object getDAO(Class daoInterface){
            initial();
            Object dao 
    = daoMap.get(daoInterface);
            
    if(null == dao){
              
    throw new DAOException();
            }
            
    return dao;
          }
          
    public static synchronized void initial(){
            
    if(null==daoMap){
              daoMap 
    = DAOConfig.load();//根據配置文件加載DAO實現配置
            }
          }
        }
        
    public class DAOConfig{
          
    private static Logger logger = LogManager.getLogger(DAOConfig.class);
          
    private static final String DAO_CONFIG_FILE = "dao.xml";
          
    private static final String DAO_CONFIG_SECTION = "DAO";
          
    public static synchronized HashMap load(){
            HashMap map 
    = new HashMap();
           
            JFigLocator jfigLocator 
    = new JFigLocator(DAO_CONFIG_FILE);
            Properties  prop 
    = daoConfig.getSectionAsProperties(DAO_CONFIG_SECTION);
            Enumeration enumSection 
    = prop.keys();
            
    while(enumSection.hasMoreElements()){
              String daoIface 
    = (String)enumSection.nextElement();
              String daoImpl 
    = prop.getProperty(daoIface);
              
    try{
                Class iface 
    = ClassToolkit.loadClass(daoIface);
                Class impl 
    = ClassToolkit.loadClass(daoImpl);
                
    //將接口作為HashMap索引,實現類作為值
                map.put(iface,impl);
              }
    catch(ClassNotFoundException e){
                logger.debug(
    "No Class Found=>"+e);
              }
            }
            
    return map;
          }
        }
      
    <?xml version="1.0" encoding="UTF-8"?>
        
    <configuration>
          
    <section name="DAO">
            
    <entry key="net.xiaxin.lab.persistence.dao.iface.CustomerDAO" value="net.xiaxin.lab.persistence.dao.impl.CustomerDAOImp_Mysql"/>
            
    <entry key="net.xiaxin.lab.persistence.dao.iface.PromotionDAO" value="net.xiaxin.lab.persistence.dao.impl.PromotionDAOImp_Mysql"
          </section
    >
        
    </configuration>

      
    public class ClassToolkit{
          
    public static Class loadClass(String className){
            Class cls 
    = null;
            
    try{
                cls 
    = Thread.currentThread().getContextClassLoader().loadClass(className);
            }
    catch(Exception e){
              e.printStackTrace();
            }
            
    if(cls == null){
              cls 
    = Class.forName(className);
            }
            
    return cls;
          }
        }
        業務層通過接口調用底層實現,具體的DAO實現類不會出現在我們的業務代碼中。而具體實現類在配置文件中加以配置,之后DAOFactory.getDAO方法通過讀取配置文件獲得當前我們期望使用的實現類的類名,在通過Java Class動態加載機制加載后返回。

        通過接口與實現的分離,并結合DAOFactory動態加載實現類,我們實現了底層訪問實現的參數化配置功能。
        無論有多好的理由,新的設計必須避免影響業務邏輯代碼的可讀性。沒有哪個物業公司能說服你在自己的房屋中增加一條穿堂而過的管道,而理由是為了實施更好的供暖設計,我們的軟件也一樣。

    posted on 2009-10-06 09:23 王永慶 閱讀(160) 評論(0)  編輯  收藏 所屬分類: HIBERNATE
    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    關注blogs

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产综合无码一区二区二三区| 性感美女视频在线观看免费精品| 亚洲高清偷拍一区二区三区| 亚洲欧美日韩中文二区 | 免费国产叼嘿视频大全网站| 亚洲日本在线观看视频| 中美日韩在线网免费毛片视频| 国产国产人免费人成免费视频| 国产精品亚洲综合一区在线观看 | 一级特黄录像视频免费| 久久亚洲高清综合| 免费av片在线观看网站| 亚洲天堂久久精品| 1024免费福利永久观看网站| 亚洲国产精品一区二区三区在线观看| 色www永久免费视频| 国产亚洲美女精品久久久久| 亚洲最大av无码网址| 国产一精品一av一免费爽爽| 亚洲国产精品一区| 69成人免费视频无码专区| 亚洲AV无码一区二区三区电影 | 久久亚洲国产欧洲精品一| 四虎影视成人永久免费观看视频 | 久久久久亚洲精品天堂| 无码国产精品一区二区免费I6 | 亚洲Av综合色区无码专区桃色| 无码精品一区二区三区免费视频 | 亚洲色偷拍区另类无码专区| 国产日韩一区二区三免费高清| 亚洲欧洲校园自拍都市| 国产嫩草影院精品免费网址| 国产情侣久久久久aⅴ免费 | 免费a级毛片高清视频不卡| 免费播放美女一级毛片| 亚洲成AV人片在线观看无码| 成年男女免费视频网站| 一级一黄在线观看视频免费| 亚洲国产高清视频在线观看| 亚洲成A人片77777国产| 一级毛片免费观看不卡的|