每日一記之策略模式

定義:

策略模式,又叫算法簇模式,就是定義了不同的算法族,並且之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。

其實策略模式是一個非常重要的模式,它把一個類中經常改變或者將來可能改變的部分提取出來,作爲一個接口,然後在定義一個上下文類中包含實現這個接口的類對象的實例,這樣類的實例在運行時就可以隨意調用實現了這個接口的類的行爲。

利用策略模式構建應用程序,可以根據用戶配置等內容,選擇不同有策略來實現應用程序的功能,策略的實現都基於統一的接口,便於以後切換算法或增加算法而不更改現有的架構。

舉個很常用的例子,我們在開發應用的過程中,常常面臨着切換數據庫的問題,在開發的時候,我們可能僅僅關注於某一數據庫。那麼在將來的運行過程中,需要卻換到其他的數據庫,那麼應該怎麼辦呢,使用策略模式則很好的解決了這個問題。

下面我們來一起看看策略模式的UML類圖:



首先我們定義了一個IDataBase的接口,用於約定算法需要實現哪些方法。然後我們寫了兩個策略具體的實現類,一個Mysql,另外一個Salserver。另外我們還需要一個Context上下文類來獲得我們具體使用的那一個數據庫。相關代碼如下:


//公共接口

<?php
Interface IDataBase{
    
    //連接數據庫
    public function connect();

    //關閉數據
    public function close();
    
    //持久化數據
    public function persist();
}


//Mysql實現方式
<?php

class Mysql extends IDataBase{
    public function connect(){
        //這裏是具體的鏈接數據庫的操作, 爲了簡單我省去了參數列表
    }
    
    public function close(){
        //關閉數據庫鏈接的代碼
    }
    
    public function persist(){
        //持久化數據庫的代碼
    }
}


//sqlserver實現方式
<?php

class Sqlserver extends IDataBase{
    public function connect(){
        //這裏是具體的鏈接數據庫的操作, 爲了簡單我省去了參數列表
    }
    
    public function close(){
        //關閉數據庫鏈接的代碼
    }
    
    public function persist(){
        //持久化數據庫的代碼
    }
}


//上下文類,通過一個單例模式得到數據庫句柄
<?php

class Context{
    private static $db = null;
    
    private function __construct(){
        //這裏可以通過配置文件得到使用什麼樣的數據庫和數據庫鏈接參數
    }
    
    public static function getInstanse(){
        if($db === null){
            return new Context();
        }
        return self::$db;
    }
}

以上代碼就是策略模式的具體實現了,我們可以看到,系統在後期如果需要添加新的數據庫支持,只需要新建一個策略類實現IDataBase接口,然後更改配置項就可以輕鬆的進行數據庫切換了。


發佈了31 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章