1. 程式人生 > >漫談設計模式之組合模式

漫談設計模式之組合模式

設計模式 組合模式

一、什麽是設計模式、為什麽要使用它

對設計模式的解釋有很多,在這裏我按個人的理解闡述一下。設計模式就是一些常見問題的優秀實踐,一套按面向接口嚴格實現的優秀方法,是經過實踐認證的、高效的、解耦的解決方案。那麽為什麽要使用它,一個設計模式定義了一個問題、定義了一個解決方案、是經過測試的、能促進良好的設計,具有很高的靈活性和可重用性。

二、什麽是組合模式

將一組對象組合為可像單個對象一樣被使用的結構。在有些書中說是屬性結構,我覺得這個限制太死,只要能靈活的組合多個對象,但並不影響使用效率,並且具有很高的可重用性和靈活性都可以當做組合模式使用。

三、組合模式的具體實踐

我這裏有一個場景,一般api之間互相交互數據的時候回需要簽名,但不同業務之間簽名是不一樣的,但簽名的原理是一樣的,這種情況能否使用組合模式。我這裏按組合模式實現了該功能。

<?php
/**
 * 遵循面向接口編程準則
 * Class SignatureInterface
 */

namespace Logic\Signature;

interface SignatureInterface
{
    public function getSecretKey();
}
?>

<?php
/**
 * Service 簽名
 * Class ServiceSignature
 */

namespace Logic\Signature;


class ServiceSignatureKey implements SignatureInterface
{
    public $_secretKey  = null;
    public function __construct ()
    {
        $this->_secretKey   = ‘Service‘;
    }

    public function getSecretKey ()
    {
        return $this->_secretKey;
    }
}
?>


<?php
/**
 * SMS 簽名
 * Class SmsSignature
 */

namespace Logic\Signature;


class SmsSignatureKey implements SignatureInterface
{
    public $_secretKey  = null;
    public function __construct ()
    {
        $this->_secretKey   = [email protected]
/* */; } public function getSecretKey () { return $this->_secretKey; } } ?> <?php /** * Class ParameterSignature * 參數簽名類 */ namespace Logic\Signature; class ParameterSignature { private $aParams = null; public function __construct (){} public function setParam($aParams) { $this->aParams = $aParams; return $this; } public function generateSignature(SignatureInterface $oSignature) { if (empty($this->aParams)) return false; //替換為自己的驗簽密鑰 $secretKey = $oSignature->getSecretKey(); unset($this->aParams[‘signature‘]); ksort($this->aParams); //把所有的值級成字符串 $paramStr = implode(‘‘, $this->aParams); $paramStr = urlencode($paramStr); //簽名轉為大寫字符串 $signature = md5(md5($paramStr) . $secretKey); $this->aParams[‘signature‘] = strtoupper($signature); return $this->aParams; } public function verifySignature(SignatureInterface $oSignature) { if (empty($this->aParams)) return false; $getSignature = isset($this->aParams[‘signature‘]) ? $this->aParams[‘signature‘] : null; //替換為自己的驗簽密鑰 $secretKey = $oSignature->getSecretKey(); unset($this->aParams[‘signature‘]); ksort($this->aParams); //把所有的值級成字符串 $paramStr = implode(‘‘, $this->aParams); $paramStr = urlencode($paramStr); //簽名轉為大寫字符串 $signature = strtoupper(md5(md5($paramStr) . $secretKey)); return ( $signature == $getSignature ) ? true : false; } } <?php /** * 業務當中使用 */ $aParams = [ ‘user_id‘ => 1, ‘mobile‘ => ‘15011111111‘, ‘msg‘ => ‘Hello,world‘ ]; //生成簽名 $oParameter = new ParameterSignature(); $oParameter->setParam($aParams); //初始化要檢驗的SMS簽名類 $oSignature = new SmsSignatureKey(); //這裏可互換 //$oSignature = new ServiceSignatureKey(); //組合模式生成簽名 $aParams = $oParameter->generateSignature($oSignature); ?>





本文出自 “我相信” 博客,請務必保留此出處http://mrcelite.blog.51cto.com/2977858/1931031

漫談設計模式之組合模式