91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

漫談設計模式之組合模式

發布時間:2020-08-23 12:09:54 來源:網絡 閱讀:733 作者:mrc_elite 欄目:開發技術

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

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

二、什么是組合模式

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

三、組合模式的具體實踐

    我這里有一個場景,一般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   = 'EGfAJFp^NGX$kK3!@e7pijEdMOaftwTz';
    }

    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);
?>





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

疏勒县| 闽清县| 苏州市| 宁海县| 新巴尔虎右旗| 雷波县| 抚州市| 桃园县| 霍邱县| 大埔县| 吴堡县| 汾阳市| 遂平县| 揭东县| 福海县| 正定县| 库尔勒市| 和平区| 临江市| 佛学| 涿州市| 安泽县| 临汾市| 隆尧县| 英吉沙县| 石阡县| 蓬溪县| 灵川县| 浦北县| 金山区| 阿图什市| 博罗县| 巴林左旗| 尖扎县| 金寨县| 米林县| 黄石市| 东乡族自治县| 孟村| 喀喇沁旗| 普宁市|