PHP OOP设计:一个对象可以有几个“模式”。我该如何定义它们?

时间:2012-12-18 21:16:05

标签: php oop properties

我有一个Display对象来处理脚本的HTML输出。它具有mode属性,该属性定义了如何生成输出的许多方面。有几种模式,我可能会在以后添加更多。每种模式都意味着它自己的参数。例如,author模式意味着authorIDsearch模式意味着Search对象作为参数,其中包含查询信息。 comment模式意味着postIDcommentID参数。

因此,mode有一个name和一些parameters,具体取决于name

我决定创建一个Display_Mode对象,它有两个属性:nameparameters。但是,如何将parameters分配给names?因此,如果我使用comment模式,则有必要表示有postIDcommentID个参数?

我目前的解决方案是:

class display_mode{
    public $name;
    public $params;

    public function __construct($name)
        {
        $this->name = $name;
        switch ($this->name){
            case 'comment':
                $this->params = array('postID', `commentID`);
                break;
            case 'author':
                $this->params = array('authorID');
            }
            //etc..
        }
    }

这看起来有点乱。有没有更好的办法?

UPD:给出答案让我问another question,关于整个设计,这也为这个提供了背景。

2 个答案:

答案 0 :(得分:4)

最好将Display_Mode类的常用功能抽象为抽象基类或接口,然后将每个单独的模式定义为从基类继承(或实现接口)的类。 / p>

然后,这些专用模式类将在其构造函数和/或方法中明确定义它们所需的参数,并负责生成每个“模式”所需的输出。

但是,如果不确切地知道你的Display_Mode课程应该做什么,那么很难给出更具体的建议。


这里的想法是你应该避免在OOP中使用do-it-all类,而是选择每个只有一个目的的小型自包含类。通过为每个模式提供可以独立呈现其内容的类,您可以轻松更改显示模式的工作方式或添加新模式。您所要做的就是添加一个新类。

这称为 loose coupling

答案 1 :(得分:1)

描述有点令人困惑,但我会为Display的每个可能的“参数”创建一个适配器。此适配器可以提供单个接口,与您要显示的资源无关。

$parameter = new UnknownPrameter;

$adapterFactory = new AdapterFactory;
$parameter = $adapterFactory->build( $parameter );

$display->present( $parameter );

其中AdapterFactory::build()为您提供的特定类型参数创建包装器。返回的实例是该参数的容器。

这种方法还可以防止计算在构造函数中累积,这会使代码更难以测试/扩展。