漫谈设计模式之组合模式

author author     2022-09-03     790

关键词:

一、什么是设计模式、为什么要使用它

    对设计模式的解释有很多,在这里我按个人的理解阐述一下。设计模式就是一些常见问题的优秀实践,一套按面向接口严格实现的优秀方法,是经过实践认证的、高效的、解耦的解决方案。那么为什么要使用它,一个设计模式定义了一个问题、定义了一个解决方案、是经过测试的、能促进良好的设计,具有很高的灵活性和可重用性。

二、什么是组合模式

    将一组对象组合为可像单个对象一样被使用的结构。在有些书中说是属性结构,我觉得这个限制太死,只要能灵活的组合多个对象,但并不影响使用效率,并且具有很高的可重用性和灵活性都可以当做组合模式使用。

三、组合模式的具体实践

    我这里有一个场景,一般api之间互相交互数据的时候回需要签名,但不同业务之间签名是不一样的,但签名的原理是一样的,这种情况能否使用组合模式。我这里按组合模式实现了该功能。

<?php
/**
 * 遵循面向接口编程准则
 * Class SignatureInterface
 */

namespace LogicSignature;

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

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

namespace LogicSignature;


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

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


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

namespace LogicSignature;


class SmsSignatureKey implements SignatureInterface
{
    public $_secretKey  = null;
    public function __construct ()
    {
        $this->_secretKey   = ‘EGfAJFp^[email protected]‘;
    }

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


<?php
/**
 * Class ParameterSignature
 * 参数签名类
 */

namespace LogicSignature;


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

设计模式之漫谈

从今天(2018-03-21)开始,我将浅谈下设计模式,这个话题肯定很多人谈过。由于我知识广度和深度均有不足,如有不合理的地方请多多包涵。在此只希望能帮助更多同行的小白,借此本人感觉很慰藉。当谈完设计模式后,我将... 查看详情

设计模式漫谈之状态模式

...,精通语法,精通编程思想。而编程思想和语法可以通过设计模式来学习。 在C语言中,可以根据类型,申请内存空间。反射也是同样的道理,根据类型申请空间。 接口相当于C语言中的申明,也是一种封装,比如,我需... 查看详情

设计模式漫谈之代理模式

 设计模式这个东西理论上多,说的人多,能理解的人少,愿意看的人少,因此我这个浏览量上不去很正常。不过我希望帮助到真正想看的人。刚和以前同事通了电话,程序员同事之间如果想成为朋友,必须一起拼搏,等若干... 查看详情

设计模式漫谈之外观模式

 最近由于项目验收的事,太忙,没有来的及更新,我不想草率的写。我尽量把自己在工作中悟到的工作经验分享给大家。一定要让自己有利用价值,否则就没有竞争力。在公司,你在老板心中有利用价值,这样才能加薪。做... 查看详情

设计模式漫谈之装饰模式

我有点像疯子,一个人开了一天酒店,来写这个。我发现我写这个系列,阅读的人很少。也许是程序员不重视思想的东西,也许是感觉我写的很Low,无所谓,我只想告诉同行,程序员重在编程思想,有了编程思想技术的路才能走... 查看详情

设计模式漫谈之解释器模式

今天5月1号了,回郑州,在家待了三天。打了几天手游,花了不少钱。家里准备再盖座房子,我也应该为家里做些贡献。真他娘累,30多了,单身,现在已有些恐婚了。近期有空要做个记账软件,否则钱花的太快了。这个月,20多... 查看详情

设计模式漫谈之备忘录模式

最近很长时间没写博客了,其实这个博客写过一半,中间有事耽搁了,就没继续。主要是给别人做了一个小系统,及维护码云上的代码库。同居的日子也占了我很多时间。最近也是烦,欠了7W,各种烦事。所以可想写个博客静静... 查看详情

设计模式漫谈之二

今天说抽象工厂。有网友提出我闲扯太多,不好意思,这个毛病改不掉了,请多多谅解。开始继续闲扯。1.在C语言中void*的指针可以转成任意类型的指针。在C#中存在有类型检查机制,且子类转成基类并不会丢数据。因为继承本... 查看详情

设计模式漫谈之责任链

这段时间谈恋爱了,也就没更新随笔。后天就软考了,不过我已经抱着失败是成功他妈的准备了。做软件不能急,要稳着性子做几年再说,刚毕业的应届生啥都想学,老想一口吃个胖子,没有5年以上的工作经验,就是再NB也不行... 查看详情

设计模式之组合模式

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式可以使用户对单个对象和组合对象的使用具有一致性。 publicabstractclassComponent{protectedStringname;publicComponent(Stringname){this.name=name;}publicabstractvoidadd(Comp... 查看详情

设计模式之组合模式

什么是组合模式?组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。... 查看详情

设计模式之组合模式(代码片段)

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式抽象代码:publicabstractclassComponentprotectedStringname;publicComponent(Stringname)this.name=name;publicabstr... 查看详情

设计模式之组合模式

设计模式之组合模式Oct19,2015组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。常见的场景有asp.net里的控件机制(即control里可以包含子contr... 查看详情

图解java设计模式之组合模式

图解Java设计模式之组合模式看一个学校院系展示需求传统方案解决学院院系展示(类图)传统方案解决学校院系展示存在的问题分析组合模式基本介绍组合模式的原理类图组合模式解决学校院系展示的应用实例组合模式在JDK集... 查看详情

headfirst设计模式之组合模式

一、定义将对象组合成树形结构来表现"整体-部分"层次结构。组合能让客户以一致的方法处理个别对象以及组合对象。主要部分可以被一致对待问题.在使用组合模式中需要注意一点也是组合模式最关键的地方:叶子对象和组合... 查看详情

设计模式之组合模式

1、组合模式的简单概要:    a、使用组合模式的场景:    - 把部分和整体的关系用树形结构来表示,从而使得客户端可以以统一的方式处理部分对象和整体对象。       ... 查看详情

设计模式之八:组合模式(compositepattern)

   什么是组合模式呢?简单来说组合模式就是将对象合成树形结构以表示“部分整体”的层次结构,组合模式使用户对单个对象和组合对象使用具有一致性。    组合模式(CompositePattern)有时候又叫部... 查看详情

大话设计模式之组合模式

组合模式  将对象组合成树形结构以表示‘部分--整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性涉及到的角色描述  在组合模式结构图中包含如下几个角色:      ●&nbs... 查看详情