gpt4 book ai didi

php - 设计模式题 : encapsulation or inheritance

转载 作者:行者123 更新时间:2023-12-04 06:53:31 25 4
gpt4 key购买 nike

我有一个问题我已经苦苦思索了很长一段时间。我正在构建一个具有两个主要类的模板引擎 Template.phpTag.php , 有一堆扩展类,比如 Img.phpString.php .

程序是这样工作的:

一个 Template 对象创建一个 Tag 对象。每个标签对象确定要实现哪个扩展类(img、string 等)。

Tag 类的重点是为每个扩展类提供帮助函数,例如 wrap('div'), addClass('slideshow') , ETC。

每个 Img 或 String 类都用于呈现特定于所需内容的代码,因此 $Img->render()会给出类似 <img src='blah.jpg' />
我的问题是:

我应该封装 Tag 对象中的所有扩展功能,如下所示:

标签.php

function __construct($namespace, $args) {
// Sort out namespace to determine which extension to call
$this->extension = new $namespace($this); // Pass in Tag object so it can be used within extension

return $this; // Tag object
}

function render() {
return $this->extension->render();
}

图片.php
    function __construct(Tag $T) {
$args = $T->getArgs();
$T->addClass('img');
}

function render() {
return '<img src="blah.jpg" />';
}

用法:
$T = new Tag("img", array(...);
$T->render();

.... 还是我应该创建更多 继承结构,因为“Img 是一个标签”

标签.php
public static create($namespace, $args) {
// Sort out namespace to determine which extension to call
return new $namespace($args);

}

图片.php
class Img extends Tag {
function __construct($args) {
// Determine namespace then call create tag
$T = parent::__construct($namespace, $args);
}

function render() {
return '<img src="blah.jpg" />';
}
}

用法:
$Img = Tag::create('img', array(...));
$Img->render();

我确实需要一个用于创建自定义标签的通用接口(interface),即我可以实例化 Img(...) 然后实例化 String(...),我确实需要使用 Tag 实例化每个扩展。

编辑:也只是为了澄清:Tag 类具有所有扩展类共有的功能,Tag 类中不应该有任何方法需要在扩展类中实现。标签类仅提供辅助功能。

我知道这是一个有点模糊的问题,我希望你们中的一些人过去已经处理过这个问题,并且可以预见到选择每种设计模式的某些问题。如果您有任何其他建议,我很想听听。

谢谢!
马特·穆勒

最佳答案

继承比将不同标签的所有功能封装在单个 Tag 中更有意义。类(class)。关注点分离很重要,因此这里最好采用基于继承的方法。否则,您最终会在单个类中拥有一堆不同的特定于标签的逻辑,这很糟糕。这是维护的噩梦!

如果您有 Img - 特定的逻辑,把它放在它自己的类中。您可以将所有常用方法放入 Tag类(class)。如果这是 Java,我会制作 Tag一个抽象类甚至一个接口(interface),并具有不同的实现( ImgDiv 等)扩展(在抽象类的情况下)或实现(在接口(interface)的情况下)。

更好的方法是使用 Tag接口(interface),然后是 AbstractTag实现所有通用逻辑的抽象类。然后您的特定标签可以实现 Tag接口(interface)和扩展AbstractTag .但是,我不知道这在 PHP 中是否完全可行,但您可以尝试做类似的事情。

关于php - 设计模式题 : encapsulation or inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2786041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com