我有一个问题,我一直辛苦了很长一段时间。我正在构建一个模板引擎,主要有两个主类Template.php
和Tag.php
,并附带一系列扩展类,如Img.php
和String.php
。设计模式问题:封装或继承
的程序是这样的:
一个模板对象创建标签对象。每个标签对象确定要实现哪个扩展类(img,string等)。
的Tag类的点是为每个扩展类如wrap('div'),
addClass('slideshow')
提供辅助功能,等等
每个图或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();
}
Img.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();
....或者我应该创造更多的继承结构的,因为 “图是一个标签”
Tag.php
public static create($namespace, $args) {
// Sort out namespace to determine which extension to call
return new $namespace($args);
}
Img.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();
有一件事我需要的是用于创建自定义的标签,即可以实例化图(...)的通用接口则实例字符串(...),我做的需要使用Tag实例化每个扩展。
编辑:也只是为了说明:标签类具有所有扩展类通用的功能,Tag类中不应该有任何方法需要在扩展类中实现。标签类仅提供帮助函数。
我知道这个问题有些模糊,我希望你们中的一些人在过去处理过这个问题,并且可以预见到某些选择每个设计模式的问题。如果您有任何其他建议,我很乐意听到他们。
谢谢! Matt Mueller
非常感谢您的建议。静态的Tag :: create(...)怎么样是合理的?自从我陷入严重的OOP之后,我已经有一段时间了。也仅仅为了说明:Tag类具有所有扩展类的通用功能,Tag类中不应该有任何需要在扩展类中实现的方法。标签类仅提供帮助函数。 – Matt 2010-05-07 03:54:25
我会做一些像'Img :: create()'。 'AbstractTag'中的构造函数应该是抽象的,所以创建标签的唯一方法就是调用特定于标签的构造函数。你可以这样做,或者在你的'Tag'类中有工厂来创建特定的标签对象。 – 2010-05-07 04:39:39