欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
學(xué)習筆記之ORM設計中用到的模式

DAO 模式

DAO 模式即 Data Access Object 模式,實(shí)際是兩個(gè)模式的組合,即 Data Accessor 模式和 Active Domain Object 模式,其中 Data Accessor 模式實(shí)現了數據訪(fǎng)問(wèn)和業(yè)務(wù)邏輯的分離,而 Active Domain Object 模式實(shí)現了業(yè)務(wù)數據的對象化封裝,一般都是將這兩個(gè)模式組合使用。

DAO 模式通過(guò)對業(yè)務(wù)層提供數據抽象層接口,實(shí)現了以下目標:
1、數據存儲邏輯的分離:通過(guò)對數據訪(fǎng)問(wèn)邏輯進(jìn)行抽象,為上層結構提供抽象化的數據訪(fǎng)問(wèn)接口。
2、數據訪(fǎng)問(wèn)底層實(shí)現的分離:通過(guò)將數據訪(fǎng)問(wèn)劃分為抽象層和實(shí)現層,從而分離了數據使用和數據訪(fǎng)問(wèn)的底層實(shí)現細節。
3、資源和調度的分離:將數據訪(fǎng)問(wèn)邏輯從業(yè)務(wù)邏輯中脫離開(kāi)來(lái),使得在數據訪(fǎng)問(wèn)層實(shí)現統一的資源調度,通過(guò)數據庫連接池以及各種緩存機制(Statement Cache,Data Cache等)的配合使用,大幅度提升系統性能。
4、數據抽象:通過(guò)對底層數據的封裝,為業(yè)務(wù)層提供一個(gè)面向對象的接口,使得業(yè)務(wù)邏輯開(kāi)發(fā)人員可以面向業(yè)務(wù)中的實(shí)體進(jìn)行編碼。即對業(yè)務(wù)層屏蔽了數據庫訪(fǎng)問(wèn)的底層實(shí)現,業(yè)務(wù)層僅包含于本領(lǐng)域相關(guān)的邏輯對象和算法。

總結來(lái)說(shuō),DAO 模式可以這么理解:
Data Accessor Object (DAO)= Data + Accessor + Domain Object

舉例來(lái)說(shuō),如下(引自《深入淺出Hibernate》):
public Double calcAmount(String customerid, double amount)
{
    // 根據客戶(hù)ID獲得客戶(hù)記錄
    Customer customer = CustomerDAO.getCustomer(custmerid);
    // 根據客戶(hù)等級獲得打折規則
    Promotion promotion = PromotionDAO.getPromotion(customer.getLevel());
    // 累積客戶(hù)總消費額,并保存累計結果
    customer.setSumAmount(customer.getSumAmount().add(amount);
    CustomerManager.save(customer);
    // 返回打折后的金額
    return amount.multiply(protomtion.getRatio());
}
從這段代碼看出,通過(guò) DAO 模式對各個(gè)數據對象進(jìn)行封裝,對業(yè)務(wù)層屏蔽了數據庫訪(fǎng)問(wèn)的底層實(shí)現,業(yè)務(wù)層僅包含于本領(lǐng)域相關(guān)的邏輯對象和算法。


Abstract Factory 模式

Abstract Factory 模式即 抽象工廠(chǎng)創(chuàng )建型模式,它提供一個(gè)創(chuàng )建一系列相關(guān)或相互依賴(lài)對象的接口,而無(wú)需制定它們具體的類(lèi)。換句話(huà)說(shuō),就是向調用者提供一個(gè)接口,使得在不必指定產(chǎn)品的具體類(lèi)型情況下,創(chuàng )建多個(gè)產(chǎn)品族中的產(chǎn)品對象,這就是抽象工廠(chǎng)模式的用意。
作為最常用的創(chuàng )建模式,抽象工廠(chǎng)模式在這里起到連接接口和實(shí)現的橋梁作用。通過(guò)該模式,可以根據具體需要加載相應的實(shí)現,并將此實(shí)現作為所對應接口的一個(gè)實(shí)例提供給業(yè)務(wù)層使用。

如抽象如下接口(引自《深入淺出Hibernate》):
public interface CustomerDAO {
    public Customer getCustomer(String custid);
    public void save(Customer customer);
}
業(yè)務(wù)層這樣使用:
CustomerDAO custDAO = (CustomerDAO) DAOFactory.getDAO(CustomerDAO.class);
Customer customer = custDAO.getCustomer(customerID);

也就是說(shuō),業(yè)務(wù)層通過(guò)接口調用底層實(shí)現,具體的DAO實(shí)現類(lèi)不會(huì )出現在業(yè)務(wù)代碼中。
不過(guò)卻帶來(lái)了另一個(gè)缺憾,即混雜了一些數據訪(fǎng)問(wèn)層的內容,如 DAOFactory.getDAO() 方法的調用,所以還需引入 Proxy 模式加以改良。


Proxy 模式

Proxy 模式即 代理結構型模式,它為其他對象提供一種代理以控制對這個(gè)對象的訪(fǎng)問(wèn)。比如說(shuō) Windows 的快捷方式和 Unix 的文件/目錄的Link文件就是一種代理的例子。
引入 Proxy 模式的作用是通過(guò)提供一個(gè)中間層(Proxy),將上層調用接口與下層的實(shí)現相銜接,以做到保持業(yè)務(wù)代碼的簡(jiǎn)潔,消除 Factory 模式帶來(lái)的缺憾。

改進(jìn)后的業(yè)務(wù)代碼如下(引自《深入淺出Hibernate》):
public Double calcAmount(String customerid, double amount)
{
    // 根據客戶(hù)ID獲得客戶(hù)記錄
    Customer customer = CustomerProxy.getCustomer(custmerid);
    // 根據客戶(hù)等級獲得打折規則
    Promotion promotion = PromotionProxy.getPromotion(customer.getLevel());
    // 累積客戶(hù)總消費額,并保存累計結果
    customer.setSumAmount(customer.getSumAmount().add(amount);
    CustomerManager.save(customer);
    // 返回打折后的金額
    return amount.multiply(protomtion.getRatio());
}
而在 CustomerProxy類(lèi)和 PromotionProxy類(lèi)中實(shí)現調用 CustomerDAO類(lèi)和 PromotionDAO類(lèi)的方法。


Decorator 模式

Decorator 模式即 裝飾結構型模式,又名包裝(Wrapper)模式。目的是利用一個(gè)對象,透明地為另一個(gè)對象添加新的功能,是繼承關(guān)系的一個(gè)替代方案。就增加功能來(lái)說(shuō),Decorator 模式相比生成子類(lèi)更為靈活。簡(jiǎn)單來(lái)說(shuō),就是通過(guò)一個(gè) Decorator 對原有對象進(jìn)行封裝,同時(shí)實(shí)現與原有對象相同的接口,從而得到一個(gè)基于原有對象的,對即有接口的增強性的實(shí)現。

在以下情況下應當使用 Decorator 模式:
1、需要擴展一個(gè)類(lèi)的功能,或給一個(gè)類(lèi)增加附加責任。
2、需要動(dòng)態(tài)地給一個(gè)對象增加功能,這些功能可以再動(dòng)態(tài)地撤銷(xiāo)。
3、需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變得不現實(shí)。

Decorator 模式有如下缺點(diǎn):
使用裝飾模式會(huì )產(chǎn)生比使用繼承關(guān)系更多的對象,更多的對象會(huì )使得查錯變得困難,特別是這些對象看上去都很相像。

舉例來(lái)說(shuō)(引自《深入淺出Hibernate》):
如果要實(shí)現連接池,并且在 Connection 對象使用后調用 close() 時(shí)不關(guān)閉連接,而是釋放到連接池中,則可以考慮實(shí)現一個(gè) ConnectionDecorator 類(lèi)來(lái)做,它實(shí)現 Connection 類(lèi)所有方法,并且所有方法都轉調 Connection 類(lèi)的相同方法。

public class ConnectionDecorator
    implements Connection {

    private Connection dbconn;
   
    public ConnectionDecorator(Connection conn) {
        this.dbconn = conn; // 實(shí)際從數據庫獲得的 Connection 引用
    }

    /**
     * 次方法將被子類(lèi)覆蓋,以實(shí)現數據庫連接池的連接返回操作
     */
    public void close() throws SQLException {
        this.dbconn.close();
    }

    // 其他方法類(lèi)似,均調用 dbconn.xxx方法

}

然后就可以實(shí)現一個(gè)類(lèi)繼承 ConnectionDecorator,而覆蓋其 close() 方法即可,如下:

public class PooledConnection
    extends ConnectionDecorator
    implements Connection {
   
    private ConnectionPool connPool;
   
    public PooledConnection(ConnectionPool pool, Connection conn) {
        super(conn);
        connPool = pool;
    }
   
    /**
     * 覆蓋close方法,將數據庫連接返回連接池,而不是直接關(guān)閉連接
     */
    public void close() throws SQLException {
        connPool.releaseConnection(this.dbconn);
    }
   
}

同樣的道理,還可以利用 Decorator 模式對 DriverManager類(lèi)進(jìn)行同樣的改造,從而最小化數據庫連接池對傳統 JDBC 編碼方式的影響.
但是由于 Decorator 模式的缺點(diǎn),會(huì )導致大量類(lèi)似的小類(lèi),并且由于此模式要求實(shí)現與目標對象一致的接口,Connection 接口中定義的方法眾多,也必須在 ConnectionDecorator 類(lèi)中逐一實(shí)現,雖然只是簡(jiǎn)單的委托實(shí)現。隨意接下來(lái)引入 Dynamic Proxy 模式很好地解決了這一問(wèn)題。


Dynamic Proxy 模式

Dynamic Proxy 模式是 JDK1.3 版本中引入的一種新的動(dòng)態(tài)代理機制(Dynamic Proxy),它為 Java 帶來(lái)了極佳的運行期擴展能力。嚴格來(lái)說(shuō),Dynamic Proxy 本身并非一種模式,只能算是 Proxy 模式的一種動(dòng)態(tài)實(shí)現方式。感覺(jué)有點(diǎn)像 Win32 里 hook 機制。

下面通過(guò)上面連接池的例子來(lái)解釋 Dynamic Proxy 機制(引自《深入淺出Hibernate》):
Dynamic Proxy 模式可以解決 Decorator 模式帶來(lái)的弊端。通過(guò)實(shí)現一個(gè)綁定到 Connection 對象的 InvocationHandler 接口來(lái)實(shí)現,使得可以在 Connection.close() 方法被調用時(shí)將其截獲,并以新的 close() 方法替代,實(shí)現連接調用關(guān)閉方法時(shí)返回到數據庫連接池中的目的。
下面是 ConnectionHandler 類(lèi),它實(shí)現了 InvocationHandler 接口,按照 Dynamic Proxy 機制的定義,invoke() 方法將截獲所有代理對象的方法調用操作,這里通過(guò) invoke() 方法截獲 close() 方法來(lái)處理。

public class ConnectionHandler
    implements Invocationhandler {
   
    Connection dbconn;
    ConnectionPool pool;
   
    public ConnectionHandler(ConnectionPool connPool) {
        this.pool = connPool;
    }
   
    /**
     * 將動(dòng)態(tài)代理綁定到指定 Connection 對象
     */
    public Connection bind(Connection conn) {
        this.dbconn = conn;
       
        Connection proxyConn =
            (Connection) Proxy.newProxyInstance(
                conn.getClass().getClassLoader(),
                conn.getClass().getInterfaces(),
                this);
               
        return proxyConn;
    }
   
    /**
     * 方法調用攔截器
     * 判斷當前調用的方法是否 "close" 方法
     * 如是,調用 pool.releaseConnection() 方法替代
     */
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
       
        Object obj = null;
       
        // 如果調用的方法是 "close" 方法
        if( "close".equals(method.getName()) ) {
            pool.releaseConnection(dbconn);
        }else {
            obj = method.invoke(dbconn, args);
        }
       
        return obj;
    }
}

另外 DbConnectionPool.getConnection() 方法也需要做修改以使用 ConnectionHandler 類(lèi):

pubic synchronised Connection getConnection()
    throws DBException {
   
    Connection conn;
   
    // 這里代碼從連接池中獲取一個(gè)空閑的連接,如無(wú)空閑連接,則創(chuàng )建一個(gè)新的連接
    ...
   
    // 這里調用 ConnectionHandler 類(lèi)來(lái)綁定獲得的連接,使之變?yōu)橐粋€(gè)連接代理返回給用戶(hù)
    ConnectionHanler connHanler = new ConnectionHanler(this);
    return connHanler.bind(conn);
}

到這里可以看到,基于 Dynamic Proxy 模式的實(shí)現相對 Decorator 更加簡(jiǎn)潔明了。

 

參考文獻:1、《深入淺出Hibernate》

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java.sql.SQLException: Can't call commit when autocommit=true(轉) - 夢(mèng)想飛揚的地方的日志 - 網(wǎng)易博客
VBA與Access數據庫的具體連接方式,DAO與ADO的利用
PetStore 中EJB 的設計模式
Mybatis框架復習大綱【面試+提高】
《Head First設計模式》閱讀筆記.全書(shū)總結
代理模式——結構型模式(7)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久