又一个“这是一种模式,如果是,那又叫什么名字”?

时间:2012-08-09 02:02:11

标签: oop design-patterns refactoring

  

从另一个不同类/类中创建一个实例。

快速示例:您正在使用ORM并在数据库中存储电子邮件队列。然后在某些时候你必须使用第三方库发送批量电子邮件。

您的对象(PHP无关紧要,公共属性为简单起见):

class Mail
{
    /**
     * @var string
     */
    public $senderText;

    /**
     * @var My\App\Entity\User
     */
    public $user;

    /**
     * @var \Doctrine\ORM\ArrayCollection
     */
    public $attachments;
}

...而你的第三方“邮件”对象则大不相同。例如,您可能需要执行以下操作:

$mail = /* hydrated */;
$user = $mail->getUser();

$mailer = new ThirdPartyMailer();

// Fill message properties
$message = $mailer->createMessage();

$fullName = sprintf('%s %s', $user->getFirst(), $user->getLast());
$message->addFrom(array($fullName => $user->getEmail()))

// Create and add attachments
foreach($mail->getAttachments() as $attachment)
{
    $message->attach($mailer->createAttachment($attachment->getFullPath()));
}

这是一种模式吗?像对象转换器之类的东西,就像负责从另一个实例创建/转换一个实例的类......

1 个答案:

答案 0 :(得分:0)

我不知道这个模式有一个广泛使用的名称,但是一些常见的名称是“translator”和“converter” - 一个在两个代表相似实体的不同类之间进行转换的类。

相关模式是adapter pattern:如果第三方消息作为接口公开,您可以创建一个包装现有邮件对象并实现第三方接口的适配器类。