漫谈设计模式之组合模式

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

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

二、什么是组合模式

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

三、组合模式的具体实践

我这里有一个场景,一般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^[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);
?>
时间: 2024-10-23 08:44:40

漫谈设计模式之组合模式的相关文章

漫谈设计模式之工厂模式

今天在这里不过多介绍什么是设计模式和为什么要使用它?可以参考漫谈设计模式之组合模式. 一.什么是抽象工厂设计模式? 一言以蔽之,抽象工厂就是用来创建功能相关的类, 二.在什么场景下使用它? 顾名思义,在我们的业务当中会有一种场景,有一个查询页面,上面有很多很多的查询条件,最终你会组合这些查询条件查询出实际想要的数据,请问你是怎么做的?下面是我的设计,运用了单例.工厂和策略模式,一切面向接口编程. 三.设计思路 1.定义策略接口,定义一个format方法 2.按实际业务抽象出三种策略,1.模糊查询

设计模式之组合模式

当需求中是体现部分与整体层次的结构时,以及你希望忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑使用组合模式了.例如:我们单个复制一个文件和多个复制文件,对我们而言,并不在乎一个文件的复制与多个文件复制的区别,也就是我们的操作是一样的. 下面的代码是建立一个公司的组织结构,其中各个部分,不管是分公司还是部门,都拥有一套相同的功能操作. 代码如下: using System; using System.Collections.Generic; using System.L

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式之组合模式(Composite)

1.定义 组合模式(Composite Pattern)也叫合成模式,将对象组合成树形结构以表示"整体-部分"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 2.通用类图 Component抽象构件角色:定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. Leaf叶子构件:叶子对象,其下再也没有其他的分支,也就是遍历的最小单位. Composite树枝构件:树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构. 3.通用源代码 package Compo

c++设计模式15 --组合模式

今天研究了一下设计模式15 组合模式 本人是菜鸟一枚,所以一开始完全不懂组合究竟是什么意思.先上图一张,树形结构图: 文档说,如果想做出这样的结构,通常考虑组合模式.那是为什么呢?现在让我们看一下组合模式的类图一本结构 想了很久,结合源代码,才搞明白,其实这个组合,意思就是说,如果我们要做这种树状结果,比如公司想让我们吧所有部门人员的 姓名,职位,薪水遍历出来,这个时候怎么办呢?那我们看树状机构图,有叶子结点和枝干结点,2种,但是2种有共性,那就是每个结点都有姓名,职位,薪水.所有叶子结点和枝干

C#设计模式:组合模式(Composite Pattern)

一,C#设计模式:组合模式(Composite Pattern) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _9.组合模式 { //组合模式主要用来处理一类具有"容器特征"的对象--即它们在充当对象的同时,又可以作为容器包含其他多个对象. //组合模式,将对象组合成树形结构以表示

C#设计模式(10)——组合模式(Composite Pattern)

一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象在功能上区别,导致在操作过程中必须区分简单对象和复合对象,这样就会导致客户调用带来不必要的麻烦,然而作为客户,它们希望能够始终一致地对待简单对象和复合对象.然而组合模式就是解决这样的问题.下面让我们看看组合模式是怎样解决这个问题的. 二.组合模式的详细介绍 2.1 组合模式的定义 组合模式

每天一个设计模式之组合模式

作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 原文地址是:<每天一个设计模式之组合模式> 欢迎关注个人技术博客:godbmw.com.每周 1 篇原创技术分享!开源教程(webpack.设计模式).面试刷题(偏前端).知识整理(每周零碎),欢迎长期关注! 如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳the

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

图解Java设计模式之组合模式 看一个学校院系展示需求 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 组合模式的原理类图 组合模式解决学校院系展示的应用实例 组合模式在JDK集合的源码分析 组合模式的注意事项和细节 看一个学校院系展示需求 编写程序展示一个学校院系结构 :需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系.如图 : 传统方案解决学院院系展示(类图) 传统方案解决学校院系展示存在的问题分析 1)将学院看