1. 程式人生 > >通過連線池操作 理解裝飾者設計模式 自我理解

通過連線池操作 理解裝飾者設計模式 自我理解

裝飾者設計模式:用於資料庫連線中close方法的增強

自我理解:裝飾者設計模式的方法增強,就是自定義一個類去實現我們需要增強的方法的介面,並定義一個成員變數物件去儲存我們之前的物件,
那麼這個成員變數所有呼叫的方法就是我們原來介面中的方法,因為成員變數物件 是我們原來物件的副本,然後改寫我們要增強的方法即可。

應用:
當我們建立資料庫連線池中連線時, 當我們用完我們建立的連線需要將連線放回到連線池(此處用集合模擬連線池)時,
此時Connection類中的close方法不能夠滿足我們的需求, 因為他是關閉連線,不是放回到連線池,
所以我們就想增強一下他的close方法,將這個方法重寫為當在連線池中呼叫close方法關閉連線時,我們將這個連線放回到連線池,
此時我們就用到了裝飾者設計模式。

自我理解:如果需要在增強後,真正的關閉連線 那麼我們需要自定義方法去獲取我們增強版的類的成員變數物件,因為這個物件就是原來的物件,再用他去呼叫我們增強類實現的接口裡面的方法,就可達到目的(其實就是將原來物件用副本物件代替執行原有的方法)

實際程式碼:
Connection conn = DriverManager...
MyConnection myConn = new MyConnection(conn);
myConn.close();//此方法增強了
myConn.commit();//底層呼叫C類具體方法,conn.commit()
連線池中之後使用都是MyConnection , pool.add(myConn)

步驟:
1.必須實現介面A
2.提供有參構造,引數型別為介面A
3.提供成員變數,存放構造方法介面實際引數(其他實現類)
4.實現需要增強的方法
5.實現不需要增強的方法,呼叫成員變數對應的方法即可


/** 目的:使用裝飾者設計模式,對Connection介面的close方法進行增強。
 * 裝飾者設計模式固定的步驟:
 * 介面A,自定義實現B,其他實現類C
 * * 模式
 *     A a = C (工具類)
 *     B b = new B(a);
 * * 實際程式碼
 * Connection conn = DriverManager....
 * MyConnection myConn = new MyConnection( conn );
 * myConn.close();        //此方法增強了
 * myConn.commit() ; //底層呼叫C類具體方法,conn.commit();
 * **連線池中之後使用都是MyConnection  ,pool.add(myConn);
 *
 * 1.必須實現介面A
 * 2.提供有參構造,引數型別為介面A
 * 3.提供成員變數,存放構造方法介面實際引數(其他實現類)
 * 4.實現需要增強的方法
 * 5.實現不需要增強的方法,呼叫成員變數對應的方法即可。
 *
 */
public class MyConnection2 implements Connection {
    
    private Connection conn;
    private List<Connection> pool;
//    public MyConnection2(Connection conn){
//        this.conn = conn;
//    }
    public MyConnection2(Connection conn,List<Connection> pool){
        this.conn = conn;
        this.pool = pool;
    }
    
    //增強的方法--將當前連線歸還給連線池
    @Override
    public void close() throws SQLException {
        //this 當前物件,表示當前連線
        pool.add(this);
    }
    //可以真實關閉
    public Connection getConnection(){
        return this.conn;
    }
    // 不增強的方法
    @Override
    public void commit() throws SQLException {
        this.conn.commit();
    }
    @Override
    public void rollback(Savepoint savepoint) throws SQLException {
        this.conn.rollback(savepoint);
    }
    
具體實現 包括真實關閉
/** 進行方法增強,對close方法進行增強。
 * 1.繼承,子類複寫父類的方法。必須明確父類(可以獲得父類名稱)。
 *     通過工具類DriverManager獲得連線,無法確定父類。
 * 2.設計模式--裝飾者,必須有介面【】
 *     設計模式:就是一段固定的程式碼,為了解決固定的問題。
 *     裝飾者目的:增強方法
 * 3.動態代理,必須有介面
 * 4.位元組碼增強,增強指定類,不需要介面
 *
 */
public class MyPool4 {
    
    //1 容器 -- LinkedList --> 增刪多,比較快
    private static LinkedList<Connection> pool = new LinkedList<Connection>();
    
    static{
        //1.1 初始化連線池,提供3個連線
        try {
            //1) 註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            
            for(int i = 0 ; i < 3 ; i ++){
                //2) 獲得連線
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ee30_day10", "root", "1234");
                // 將連線新增到池中
                //pool.add(conn);  //conn 提供連線的close存在缺陷,沒有將連線歸還給連線池
                //3)將已經增強close的MyConnection新增到連線池中
                MyConnection myConn = new MyConnection( conn , pool );
                pool.add(myConn);
            }
            
            //3) JVM 虛擬機器關閉時,真實關閉連線
            Runtime.getRuntime().addShutdownHook(new Thread(){
                @Override
                public void run() {
                    try {
                        Thread.sleep(100);
                        for(Connection myConn : pool){
                            if(myConn instanceof MyConnection){    //判斷前面變數是否是後面指定型別
                                MyConnection my = (MyConnection) myConn;
                                System.out.println("真實關閉" + my);
                                my.getConnection().close();
                            }
                        }
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }

                }
            });
            
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    
    //2 獲得連線,先判斷池中是否有,如果有移除。否則等待100毫秒,遞迴
    public static Connection getConnection(){
        //有
        if(! pool.isEmpty()){
            return pool.removeFirst();
        }
        
        //沒有
        try {
            Thread.sleep(100);
        } catch (Exception e) {
        }
        return getConnection();
    }
    
    //3 釋放資源--將連線歸還給連線池(新增到池中)
    public static void closeResource(Connection conn){
        //conn.close();  //真的關閉連線
        pool.add(conn);
    }
    

}

相關推薦

通過連線操作 理解裝飾設計模式 自我理解

裝飾者設計模式:用於資料庫連線中close方法的增強 自我理解:裝飾者設計模式的方法增強,就是自定義一個類去實現我們需要增強的方法的介面,並定義一個成員變數物件去儲存我們之前的物件, 那麼這個成員變數所有呼叫的方法就是我們原來介面中的方法,因為成員變數物件 是我們原來物件的

C# 通過 Observer觀察 設計模式理解 抽象類 和 介面 應用在什麼地方

什麼時候用抽象類?什麼時候用介面?怎麼理解抽象類?怎麼理解介面? 一、百度解釋抽象類和介面的區別 總而言之就是一句話:抽象類可以包含具體實現,介面只能包含定義。 實現介面時必須實現介面定義的方法等,抽象類中如果給方法加上了“abstract”,那麼這個方法也需要在繼承後實現這個

簡單Java程式碼例項助你通俗易懂的理解什麼是裝飾()設計模式 (Decorator)

首先拋開到處都有的文字概念。來看下面的例子。 現在以:人吃飯。這個需求為例。來講解這個設計模式。 1.0:想當年,人們都比較樸實。吃飯就是簡簡單單的吃飯。 那麼PersonBefore類裡面一個簡單的

Java——裝飾設計模式

結合了一些百度百科的概念然後使用程式碼進行理解~ 裝飾者模式: 指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 使用場景: ​​​​​​​需要擴充套件一個類的功能,或給一個類新增附加

裝飾設計模式

裝飾者模式具有的一些特徵 1,裝飾者(decorator)和被裝飾(擴充套件)的物件有著相同的超類(supertype)。 2,我們可以用多個裝飾者去裝飾一個物件。 3,我們可以用裝飾過的物件替換程式碼中的原物件,而不會出問題(因為他們有相同的超類)。 4,裝飾者可以

42、Java裝飾設計模式

設計模式簡介 什麼是設計模式?設計模式是可以重複利用的解決方案。軟體開發的先驅或者前輩們將之前在開發中遇到的問題進行總結並給出瞭解決方案,後輩在遇到這些問題之後直接使用這些方案即可解決問題。比如蓋高樓,都是先挖地基,然後再蓋,如果先蓋樓後挖地基,可能蓋不了幾層,樓就倒了。 裝飾者設計模式 使用場景:給某

JavaWeb中使用Filter以及裝飾設計模式解決全域性編碼格式問題

裝飾者設計模式簡介 定義:動態給物件新增一個額外的職責,擴充其功能,使用裝飾者設計模式相比生成的子類顯得更為靈活。 設計初衷:Java中通常使用繼承來達到擴充功能的目的,如果需要實現的功能種類繁多,勢必會擴充出很多子類,這增加了系統的複雜性,而且如果要使用繼

java中裝飾設計模式

裝飾者設計模式 : 增強一個類的功能,而且可以讓這些類互相裝飾。 裝飾者設計模式的步驟 : 在裝飾類的內部維護一個被裝飾的引用 讓裝飾類有一個共同的父類或者是父介面 繼承實現的增強類和裝飾模式實現的增強類的區別 : 繼承實現的

用過濾器和裝飾設計模式(靜態代理)解決getParameter亂碼問題

post的亂碼問題比較好解決,這裡主要是對get請求的亂碼做處理 解決思路:增強request物件的getParameter方法,使之 getParameter  直接獲取到的就是解決亂碼後的資料 有四種方式,   1、繼承 :(下下策)      ①明確知道全類名 

設計模式:三段程式碼讓你理解 裝飾模式

package com.zx.b_decorator; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader;

Android多執行緒操作sqlite資料庫連線框架的一種設計思路

我們在Android應用程式開發當中經常會用到資料庫,一般在有兩種主要開發思路。 第一種:每次需要對資料庫操作的時候建立連線,操作完成後,馬上關閉連線。 這個方式一般用於不怎麼頻繁操作資料庫的情況,用完後馬上關閉達到節省系統資源的目的。 第二種:應用程式一

c3p0連線操作資料庫亂碼

今天使用c3p0 xml 配置檔案操作資料庫一直出現中文亂碼  在網上找了好久 終於找到了解決辦法 如果你的程式執行沒有問題 只是出現亂碼的情況  那麼只要在 這個後面加上 &amp;useUnicode=true&amp;characterEncodin

JDBC-資料庫連線/操作

1.資料庫連線池的必要性 不使用資料庫連線池: 在使用開發基於資料庫的web程式時,傳統的模式基本是按以下步驟:   在主程式(如servlet、beans、DAO)中建立資料庫連線。 進行sql操作 斷開資料庫連線。 這種模式開發,存在的問題: 普通的JDBC

連線Connection Pool 單例設計

連線池單例模式 1.私有化ComboPooledDataSource將其作為屬性,使其實現單例 2.DataSourceFactory實現懶漢模式,這樣作為屬性的連線池cpds也就變為了單例 3.

Android與設計模式——裝飾(Decorator)模式

在閻巨集博士的《JAVA與模式》一書中開頭是這樣描述裝飾(Decorator)模式的:   裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替

關於設計模式(單例模式、工廠模式、代理模式、介面卡模式、觀察設計模式)的理解

1):單例模式 package designMode.singleton; /** * 單例模式形成的原因: * * 構造器私有---> 外界無法例項化,就在類內部建立一個例項物件,用static修飾,可以用類名直接呼叫---> 但是,類的一般用法都講究

徹底理解:裝飾模式

     網站新聞模組中應用裝飾模式      本人現今對設計模式特別感興趣,因為它的功能實在是太吸引人啦.設計模式一般說來是為了增加系統的可擴充套件性及維護性。在一般的入口網站中都會有新聞展示這個功能

觀察設計模式

實現 per 合並 一個 num ride blog 通知 elf 1.觀察者接口及實現類 //一個Observer接口: 1.public interface Observer { 2. public void update(); 3.} //兩個實

深入理解javascript之設計模式

rip 是我 解決問題 不想 接受 button move center 常識 設計模式 設計模式是命名、抽象和識別對可重用的面向對象設計實用的的通用設計結構。設計模式確定類和他們的實體、他們的角色和協作、還有他們的責任分配。 每個設計模式都聚焦於一個面向對象的設計難題

設計模式: 自己手動實現一個觀察設計模式

package rgs name gree 觀察者設計模式 forecast server 它的 upd 觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。 在觀察者模式中,會