【问题标题】:Class contains only static function, which design pattern apply?类仅包含静态函数,适用哪种设计模式?
【发布时间】:2017-02-02 08:11:13
【问题描述】:

我建立了一个只有静态方法的类。这个类基本上是一个 URL 构建器,包含 2 个公共静态方法。这些方法调用同一类中的私有方法。

我的问题是:

可以重写这个类来应用设计模式吗?在我看来,它接近立面或装饰!我的方法正确吗?

class UrlBuilder{
/**
 * @param Model $model
 * @return string
 */
private static function jsonFyModelAttribute(Model $model){
    return json_encode($model->attributes);
}

private static function objectFy(array $json){
    return json_decode($json['payload']);
}

/**
 * @param $str
 * @return string
 */
private static function buildFormUrl($str){
    $slug = self::encodeUrl($str);
    return $url = Yii::$app->params['formsUrl'].'pay?pay=' . $slug;
}

/**
 * @param Model $model
 * @return string
 */
public static function sign(Model $model){
    $jws = new SimpleJWS([ 'alg' => 'RS256']);
    $payLoad = self::jsonFyModelAttribute($model);
    $jws->setPayload([
        'payload' => $payLoad
    ]);

    $privateKey =    openssl_pkey_get_private("file:///var/pems/mykey.pem");
    $jws->sign($privateKey);
    return self::buildFormUrl($jws->getTokenString());
}

/**
 * @param $str
 * @return array
 */
public static function unSign($str){
    $data = self::decodeUrl($str);
    $jws= SimpleJWS::load($data);
    $publicKey = openssl_pkey_get_public("file:///var/pems/pubkey.pem");
    if ($jws->isValid($publicKey, 'RS256')) {
        return self::objectFy($jws->getPayload());
    }
}

/**
 * @param $str
 * @return string
 */
private static function encodeUrl($str){
    return urlencode($str);
}

/**
 * @param $str
 * @return string
 */
private static function decodeUrl($str){
    return urldecode($str);
}

}

【问题讨论】:

  • 伙计,我不希望重写任何东西:),我问:这段代码接近哪种设计模式?谁说“重写”?

标签: php oop design-patterns


【解决方案1】:

问题是,为什么要使用设计模式?设计模式不是万能的解决方案,您的代码不必包含尽可能多的设计模式。顺便说一句:设计模式从不涉及单个类。它始终是不同类之间的交互和通信以及如何处理它。

对于您的示例,我的建议是遵循KISS 原则。当你真正需要它们时,模式可能会在很久以后出现(这真的很难, 即使对于有经验的程序员,也要识别这种情况)

【讨论】:

  • 我喜欢你的回答,而且我可以补充一下,每个特定的模式只能解决一个特定的问题。所以如果不是你的情况 - 请不要使用模式。
  • 谢谢,您的添加完全正确。
【解决方案2】:

让我们从定义开始。

Facade - 是一个对象,它为更大的代码体(例如类库)提供简化的接口。
Decorator - 是一种设计模式,允许将行为静态或动态添加到单个对象,而不会影响其他对象的行为。

所以,你的情况不是门面也不是装饰者。您的服务提供了一些有用的东西。我认为它只是帮手,你不必为了设计模式而应用一些设计模式......

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2023-03-10
    • 2010-09-12
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多