我需要创建一个代理类来提供对项目中某些第三方库(xls生成器)的访问。代理类本身很简单,大多是前进的。但是当我试图控制参数设置时发现它变得有点棘手。 假设我正在使用XLS文档和我的代理类来提供一种为Sheet或Cell设置一些选项的方法。最容易(也可能是错误的)解决方案就是这样:
abstract class AbsctractXLSProxy {
protected $xls;
abstract public function setSheetSomeOption($value);
abstract public function setSheetOtherOption($value);
abstract public function setCellOption1($value);
abstract public function setCellOption2($value);
}
class MyXLSProxy extends AbsctractXLSProxy {
public function __construct($xls) { $this->xls = $xls; }
public function setSheetSomeOption($value) { $this->xls->setOption($value); }
public function setSheetOtherOption($value) { $this->xls->setOption($value); }
public function setCellOption1($value) { $this->xls->setOption($value); }
public function setCellOption2($value) { $this->xls->setOption($value); }
/*..... some other stuff */
}
这在稳定性方面是非常好的方法,但我必须在主抽象代理中为我想要设置的每个选项编写一个专用方法。 我在这里看到的其他选项是为每个子对象创建通用选项设置器。像这样:
abstract class AbsctractXLSProxy {
protected $xls;
abstract public function setSheetOption($optName,$optValue);
abstract public function setCellOption($optName,$optValue);
}
class MyXLSProxy extends AbsctractXLSProxy {
public function __construct($xls) { $this->xls = $xls; }
public function setSheetOption($optName,$value) { $this->xls->getSheet->{'set'.$optName}($value); }
public function setCellOption($optName,$value) { $this->xls->getCell->{'set'.$optName}($value); }
/*..... some other stuff */
}
这更灵活,但不会保护我免于遇到隐藏在代码深处的一些被遗忘的选项,新代理实现将不支持该选项。
参数对象可以帮助我,至少列举我的代理必须支持的所有选项:
class XLSSheetOptions {
public $someSheetProperty;
public $otherSheetProperty;
}
class XLSCellOptions {
public $someCellProperty;
public $otherCellProperty;
}
abstract class AbsctractXLSProxy {
protected $xls;
abstract public function setSheetOption(XLSSheetOptions $opt);
abstract public function setCellOption(XLSCellOptions $opt);
}
class MyXLSProxy extends AbsctractXLSProxy {
public function __construct($xls) { $this->xls = $xls; }
public function setSheetOption(XLSSheetOptions $opt) { /* set sheet options according to XLSSheetOptions object */}
public function setCellOption(XLSCellOptions $opt) { /* set cell options according to XLSCellOptions object */}
/*..... some other stuff */
}
好多了,但仍然没有保证我会为XLS * Options对象中显示的每个选项设置适当的setter。
问题:是否有任何模式或技巧将这两个 - 抽象代理类和参数对象联系在一起? 我想确定无论谁打算建立新的代理实现,他都不会留下任何必要的选项。