1、單例模式
前幾天跟一個朋友討論的時候,朋友提了一個問題,爲什麼所有類不都用單例模式,都用單例模式真的是最好的嗎?
php中不管是new出來的對象還是靜態變量,只對本次請求有效,當一次請求結束的時候,所有的對象和變量都會被銷燬。
當一個對象每次請求只用一次的時候,單例模式和直接new沒什麼區別吧。
另一點,當一個對象涉及較多的屬性修改或設置,又需要多次使用,很多時候可能我們更希望每次都進行初始化,而不是直接使用一個不知道被做了哪些操作的對象
綜上,個人認爲,單例模式更適用於一次請求需要多次使用,且不涉及過多屬性修改的對象。
2、觀察者模式
觀察者模式適用於某一個狀態發生變化時,其他幾處需要針對此變化做出不同的反應。符合接口隔離原則,實現了對象之間的鬆散耦合。
php SPL中已經提供了SplSubject和SqlOberver接口,分別編寫被觀察者類和觀察者類實現這兩個接口即可。
下邊是一個demo:
class Subject implements SplSubject
{
private $observers;
public function attach(SplObserver $observer)
{
if (!in_array($observer, $this->observers)) {
$this->observers[] = $observer;
}
}
public function detach(SplObserver $observer)
{
if (false != ($index = array_search($observer, $this->observers))) {
unset($this->observers[$index]);
}
}
private function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
public function setCount($count)
{
echo "數據量加" . $count;
}
public function setIntegral($integral)
{
echo "積分量加" . $integral;
}
}
class Observer1 implements SplObserver
{
public function update($subject)
{
$subject-> setCount(1);
}
}
class Observer2 implements SplObserver
{
public function update($subject)
{
$subject-> setIntegral(10);
}
}
class Client
{
public function test()
{
$subject = new Subject();
$subject->attach(new Observer1());
$subject->attach(new Observer2());
$subject->notify();//輸出:數據量加1 積分量加10
}
}
觀察者模式更適用於一個主體需要動態旳增加屬性或其他相關項的情景,例如一個swich操作,當這個switch需要頻繁的增加種類,而你又不想對原有代碼造成影響時,可以考慮觀察者模式(一個不恰當的例子)。
又如當主體變化時,你希望跟主體相關的對象都相應的做出變化時,可以用觀察者模式。
事件:
事件更像是觀察者模式的反向:多個地方的不同操作需要觸發同一個操作事件
事件是埋多個點,觸發一個點。而觀察者是埋一個點,觸發多點變化。