对象内的依赖关系
我有这个代码
class Duck { protected $strVocabulary; public function Learn() { $this->strVocabulary = 'quack'; } public function Quack() { echo $this->strVocabulary; } }
该代码是在PHP中,但问题不是PHP的依赖。 在它知道要Qu鸭子之前必须学会。
我的问题是:只有在调用了Learn()
之后,我如何才能使Quack()
可调用?
不,这并不违反任何OOP原则。
一个突出的例子是一个对象的行为取决于连接是否建立(例如函数doNetworkStuff()
依赖于openConnection()
)。
在Java中,甚至还有一个类型状态检查器,它会在编译时执行这种检查( Duck
是否已经可以使用Quack()
)。 我经常有这样的依赖关系作为接口的先决条件,并使用一个转发类,其唯一目的是协议并检查它转发的对象的状态,即协议哪些函数已在对象上调用,并引发异常(例如InvalidStateException)前提条件不符合。
处理这种情况的设计模式是state:它允许对象在其内部状态改变时改变其行为。 该对象似乎会改变其类。 来自四人帮的设计模式书也使用上面的网络连接的例子,无论是建立还是不建立。
如果你想修改顺序,那么你可以使用抽象基类,在函数quack()中你先调用learn(),然后抽象方法doquack()(一些其他的好名字,这将必须由每个派生类)。
我的问题是:只有在调用了Learn()之后,我如何才能使Quack()可调用?
你可以分开担忧:
class EnrolleeDuck {
public function Learn() {
return new AlumnusDuck('quack');
}
}
class AlumnusDuck
{
protected $strVocabulary;
public function __construct(&strVocabulary) {
&this->strVocabulary = &strVocabulary;
}
public function Quack() {
echo $this->strVocabulary;
}
}
这是我在PHP中的第一行,请随时纠正
链接地址: http://www.djcxy.com/p/54867.html上一篇: Dependencies inside an object
下一篇: Are there any concurrency debugging tools for C#.NET in VS2010