💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 观察者模式 * * * * * 说明: > 观察者模式定义了一种一对多的依赖关系,让多个观察者对象可以同时监听某一个主题对象,这个主题对象在发生状态变化时,会通知所有观察者对象,使它们能够自动更新自己,解决的是“当一个对象的改变需要同时改变多个其他对象”的问题 适用场景: >1、 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用的情况下。 2、当对一个对象的改变需要同时改变其他对象,而又不知道具体有多少对象有待改变的情况下。 3、当一个对象必须通知其他对象,而又不能假定其他对象是谁的情况下。 优缺点: 优点: 1. 支持松耦合,减少依赖性 2. 观察器可观察 缺点: 1. 性能降低 2. 内存泄漏 3. 隐藏的依赖项 4. 测试/调试困难 5. 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃,在使用观察者模式应特别注意这点 实例: ~~~ interface IObserver { function onChanged($sender, $args); } interface IObservable { function addObserver($observer); } class UserList implements IObservable { private $_observers = array();// 观察者数组 public function addObserver($observer)// 添加观察者 { $this->_observers [] = $observer; } public function addCustomer($name)// 执行观察者方法 { foreach ($this->_observers as $obs) $obs->onChanged($this, $name); } } class UserListLogger implements IObserver { public function onChanged($sender, $args) { echo("'$args' added to user list\n"); } } $ul = new UserList (); $ul->addObserver(new UserListLogger ());// 添加观察者 $ul->addCustomer("Jack"); ~~~ 资料来源: http://www.cnblogs.com/yangjinjin/archive/2013/01/31/2887501.html http://www.cnblogs.com/zhili/p/ObserverPattern.html