【问题标题】:Developing an API layer. Need some advice and feedback about usage of Decorator pattern开发 API 层。需要一些关于使用装饰器模式的建议和反馈
【发布时间】:2011-04-25 20:37:14
【问题描述】:

我正在为我的应用程序开发一个 api 层。我设计了一个结构,需要一些建议/反馈。您可以在底部找到该结构的基本实现。

这是我对结构的要求:

  • 来自 API 命令的响应可能需要采用不同格式(JSON、XML 等)
  • 有些 API 命令可能需要身份验证,有些可能不需要
  • 每个 API 命令都应通过插件对扩展开放(事件通知、输入/输出参数过滤等)

考虑到这些要求,我将装饰器模式应用于我的 API 层。我不确定我是否设计了正确的结构并且需要确定它。

需求列表中的最后一项没有包含在下面的实现中,因为我仍在尝试弄清楚如何做到这一点。

你怎么看?我走对了吗?

<?php

// Interfaces
interface I_API_Command {}

// Abstract classes
abstract class A_API_Command implements I_API_Command
{
    abstract public function run();
}

abstract class A_Decorator_API_Command implements I_API_Command
{
    protected $_apiCommand;
    public function __construct(I_API_Command $apiCommand) {
        $this->_apiCommand = $apiCommand;
    }
    abstract public function run();
}

// Api command class
class APIC_Tasks_Get extends A_API_Command
{
    public function run() {
        // Returns tasks
    }
}

// Api command decorator classes
class APICD_Auth extends A_Decorator_API_Command
{
    public function run() {
        // Check authentication
        // If not authenticated: return error

        // If authenticated:
        return $this->_apiCommand->run()
    }
}

class APICD_JSON_Formatter extends A_Decorator_API_Command
{
    public function run() {
        return json_encode($this->_apiCommand->run());
    }
}

// Usage
$apiCommand = new APICD_JSON_Formatter(new APICD_Auth(new APIC_Tasks_Get()));
$apiCommand->run();

?>

【问题讨论】:

  • 现在我在想也许我应该实现策略模式而不是装饰器模式。因为我想选择一种不同的输出格式策略,而不是一层一层的输出格式策略。也许是用于输出格式的策略模式和用于身份验证的装饰器模式。天哪!?

标签: php oop design-patterns decorator


【解决方案1】:

在我看来……我认为老式的 MVC 就足够了……

来自 API 命令的响应可能需要采用不同的格式 格式(JSON、XML 等)

控制器将读取请求并更改视图以选择格式输出信息。或者您可以将请求传递给视图,视图将更改输出格式。

有些 API 命令可能需要身份验证,有些可能不需要

这也是控制器的任务,读取和验证请求。如果用户未通过身份验证,则会更改响应

每个 API 命令都应该通过插件对扩展开放(事件通知、输入/输出参数过滤等)

现在这是棘手的部分。您可以修改控制器并实现策略模式。如果您打算不断更改插件,这是一个好主意。

在我的例子中,我有多个控制器,我使用一个控制器工厂来读取请求并返回一个管理该请求的控制器。

我不确定你想如何实现你的插件。当您说Notification on events 时,我觉得您可以使用观察者模式,而filtering of input/output paramters 似乎是控制器的任务。

我希望这会有所帮助。祝你好运

【讨论】:

  • 如果我错了,请纠正我。您的建议是,对于每个 API 命令,我都需要一个控制器。例如;对于 API 命令类 APIC_Tasks_Get,我需要一个控制器来调用该命令,如果需要检查身份验证并根据请求类型返回正确的视图?
  • 嗯,您可以为每个命令设置一个控制器。但您最终可能会得到很多控制器。我们的想法是将您的 api 命令分组到几个控制器上。在您的示例中:我有一个 APIC_Task_Controller 类来管理 APIC_Tasks_Get、APIC_Tasks_Set、APIC_Tasks_Describe 等。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多