您好,登錄后才能下訂單哦!
一、什么是設(shè)計(jì)模式、為什么要使用它
對(duì)設(shè)計(jì)模式的解釋有很多,在這里我按個(gè)人的理解闡述一下。設(shè)計(jì)模式就是一些常見問題的優(yōu)秀實(shí)踐,一套按面向接口嚴(yán)格實(shí)現(xiàn)的優(yōu)秀方法,是經(jīng)過實(shí)踐認(rèn)證的、高效的、解耦的解決方案。那么為什么要使用它,一個(gè)設(shè)計(jì)模式定義了一個(gè)問題、定義了一個(gè)解決方案、是經(jīng)過測(cè)試的、能促進(jìn)良好的設(shè)計(jì),具有很高的靈活性和可重用性。
二、什么是組合模式
將一組對(duì)象組合為可像單個(gè)對(duì)象一樣被使用的結(jié)構(gòu)。在有些書中說是屬性結(jié)構(gòu),我覺得這個(gè)限制太死,只要能靈活的組合多個(gè)對(duì)象,但并不影響使用效率,并且具有很高的可重用性和靈活性都可以當(dāng)做組合模式使用。
三、組合模式的具體實(shí)踐
我這里有一個(gè)場(chǎng)景,一般api之間互相交互數(shù)據(jù)的時(shí)候回需要簽名,但不同業(yè)務(wù)之間簽名是不一樣的,但簽名的原理是一樣的,這種情況能否使用組合模式。我這里按組合模式實(shí)現(xiàn)了該功能。
<?php /** * 遵循面向接口編程準(zhǔn)則 * 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 * 參數(shù)簽名類 */ 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; //替換為自己的驗(yàn)簽密鑰 $secretKey = $oSignature->getSecretKey(); unset($this->aParams['signature']); ksort($this->aParams); //把所有的值級(jí)成字符串 $paramStr = implode('', $this->aParams); $paramStr = urlencode($paramStr); //簽名轉(zhuǎn)為大寫字符串 $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; //替換為自己的驗(yàn)簽密鑰 $secretKey = $oSignature->getSecretKey(); unset($this->aParams['signature']); ksort($this->aParams); //把所有的值級(jí)成字符串 $paramStr = implode('', $this->aParams); $paramStr = urlencode($paramStr); //簽名轉(zhuǎn)為大寫字符串 $signature = strtoupper(md5(md5($paramStr) . $secretKey)); return ( $signature == $getSignature ) ? true : false; } } <?php /** * 業(yè)務(wù)當(dāng)中使用 */ $aParams = [ 'user_id' => 1, 'mobile' => '15011111111', 'msg' => 'Hello,world' ]; //生成簽名 $oParameter = new ParameterSignature(); $oParameter->setParam($aParams); //初始化要檢驗(yàn)的SMS簽名類 $oSignature = new SmsSignatureKey(); //這里可互換 //$oSignature = new ServiceSignatureKey(); //組合模式生成簽名 $aParams = $oParameter->generateSignature($oSignature); ?>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。