【问题标题】:OOP pattern to convert one data format to another将一种数据格式转换为另一种数据格式的 OOP 模式
【发布时间】:2013-01-09 17:06:09
【问题描述】:

假设我有一个包含几十个属性的类的实例。此类不能修改或扩展。

我现在需要将一些数据从这个实例传递给一个函数。该函数只需要其中一些属性,它不能直接使用类的实例(它需要一个关联数组),并且还需要一些实例中不存在的数据。所以我需要将实例转换为关联数组。

例如我需要转换这个:

class Person {

    public $id = 123;
    public $firstName = "John";
    public $lastName = "Something";
    public $address;
    public $city;
    public $zipCode;
    // etc.

}

到这里:

array(
    'id' => 123,
    'name' => 'John Something'
);

我的问题是:是否有任何已知的 OOP 模式来处理这种转换?我知道我可以编写一个简单的函数来从一种格式转换为另一种格式,但我想知道“正确”的方法是什么,如果可能的话基本上使用已知的模式。

【问题讨论】:

  • 这听起来可能离题了。但我很好奇你为什么把 $ 放在变量名之前。
  • 我认为使用反射迭代对象的属性是解决此类问题的一种很好的通用方法。
  • 抱歉,没有看到 PHP 标签。
  • @davioooh,示例代码在 PHP 中,但我想我的问题是语言中立的,一般来说是关于 OOP 模式。

标签: php oop design-patterns


【解决方案1】:

当您要求设计模式时,Adapter Pattern 可能是最合适的一个

在您的示例中,Person 将是 Adaptee,而您的 Adapter 将扩展 Array-Class 并覆盖访问方法。适配器的实现可能会有所不同,因为您仍然需要决定是要显式访问适配器字段还是要封装通用访问(例如使用反射)。

请注意,此解决方案并不是真正“转换”为独立数组,因为数据仍然支持在您的 Person 实例中,这对您可能有的要求有影响:

  • 由于您还想添加其他数据字段,您可能需要根据您的逻辑进一步扩展适配器。
  • 检查您的要求是否应将其他数组操作反映到 Person 实例

【讨论】:

  • 适配器还可以包含一些逻辑,例如在您的示例中加入名字 + 姓氏
【解决方案2】:

您可以快速而肮脏地尝试强制转换为数组:

class Person {

    public $id = 123;
    public $firstName = "John";
    public $lastName = "Something";
    public $address;
    public $city;
    public $zipCode;
    // etc.

}

$person = new Person;
var_dump( (array)$person);

输出:

array(6) {
  ["id"]=>
  int(123)
  ["firstName"]=>
  string(4) "John"
  ["lastName"]=>
  string(9) "Something"
  ["address"]=>
  NULL
  ["city"]=>
  NULL
  ["zipCode"]=>
  NULL
}

工作示例:http://ideone.com/EddQI8

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多