您的位置:首页 > 其它

个人对单例模式和观察者模式及事件的一点理解

2015-08-07 21:46 204 查看
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需要频繁的增加种类,而你又不想对原有代码造成影响时,可以考虑观察者模式(一个不恰当的例子)。

又如当主体变化时,你希望跟主体相关的对象都相应的做出变化时,可以用观察者模式。

事件:

事件更像是观察者模式的反向:多个地方的不同操作需要触发同一个操作事件

事件是埋多个点,触发一个点。而观察者是埋一个点,触发多点变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: