温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

漫谈设计模式之组合模式

发布时间:2020-08-23 12:09:54 来源:网络 阅读:961 作者: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