深圳企业网站建设服务哪家公司好,ppt精美模板,教育网站前置审批,淘宝网页版官网简介#xff1a;
观察者模式#xff0c;它是一种行为型设计模式#xff0c;它允许一个对象自动通知其依赖者#xff08;观察者#xff09;状态的变化。当被观察者的状态发生改变时#xff0c;它会通知所有的观察者对象#xff0c;使他们能够及时做出响应。在观察者模式…简介
观察者模式它是一种行为型设计模式它允许一个对象自动通知其依赖者观察者状态的变化。当被观察者的状态发生改变时它会通知所有的观察者对象使他们能够及时做出响应。在观察者模式中被观察者和观察者对象之间不需要知道对方的具体实现只需要知道对方的接口从而避免了紧耦合的关系。
在观察者模式中有以下几个核心组成部分 1、被观察者Subject它是一个抽象类或接口维护一个观察者对象的列表并定义了注册和删除观察者对象的方法。当被观察者的状态发生变化时它负责通知所有已注册的观察者对象。 2、具体被观察者ConcreteSubject它是被观察者的具体实现它维护一个状态并定义了存储状态的方法。当它的状态发生变化时它会通知所有已注册的观察者对象。 3、观察者Observer它是一个抽象类或接口定义了更新方法以响应被观察者的状态变化。 4、具体观察者ConcreteObserver它是观察者的具体实现实现了更新方法以响应被观察者的状态变化并执行一些具体的业务逻辑处理。
在观察者模式中被观察者和观察者之间形成了一种“一对多”的关系当被观察者的状态发生变化时所有注册的观察者都会得到通知并做出相应的响应。这种设计模式使得观察者与被观察者之间的耦合度降低符合开闭原则可以动态地增加或者删除观察者对象。然而也需要注意避免出现循环依赖的问题并确保在适当的时候移除观察者对象避免内存泄漏的问题。
观察者模式的使用场景 1、关联行为场景观察者模式适用于建立一套触发机制的场景例如用户关注某个商品的价格当商品降价时进行通知这样用户和商品产生了关联触发机制就是商品降价。 2、事件处理系统观察者模式可以用于实现事件处理系统例如在购物网站中多个用户关注某商品后当商品降价时就会自动通知关注该商品的用户。
总的来说观察者模式适用于需要实现一对多的依赖关系并且需要在对象状态改变时自动通知所有依赖者的场景。
观察者模式的创建步骤 1、创建被观察者Watched类该类通常包含一个观察者列表以及一个用于添加、删除和通知观察者的方法。 2、创建观察者Watcher类该类通常包含一个更新方法用于在被观察者状态发生改变时更新自身状态。 3、在被观察者类中添加注册和注销观察者的方法以便于添加和删除观察者对象。 4、在被观察者类中实现通知观察者的方法以便于在状态发生改变时通知所有观察者对象。 5、创建具体被观察者ConcreteWatched类该类继承自被观察者类并实现具体的业务逻辑。 6、创建具体观察者ConcreteWatcher类该类继承自观察者类并实现具体的业务逻辑。 7、将具体被观察者和具体观察者对象进行组合以便于在被观察者状态发生改变时通知所有观察者对象。
以上是观察者模式的基本创建步骤需要注意的是在实际应用中可能需要根据具体情况进行调整和优化。
观察者模式的优点主要包括 1、实现表示层和数据逻辑层的分离并定义了稳定的消息更新传递机制抽象了更新接口使得可以有各种各样不同的表示层充当具体观察者角色。 2、在观察目标和观察者之间建立一个抽象的耦合观察目标只需要维持一个抽象观察者的集合无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起因此它们可以属于不同的抽象化层次。 3、支持广播通信观察目标会向所有已注册的观察者对象发送通知简化了一对多系统设计的难度。 4、符合“开闭原则”的要求增加新的具体观察者无须修改原有系统代码在具体观察者与观察目标之间不存在关联关系的情况下增加新的观察目标也很方便。
观察者模式的缺点主要包括 1、如果一个观察目标对象有很多直接和间接观察者将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间存在循环依赖观察目标会触发它们之间进行循环调用可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。
因此在使用观察者模式时需要注意以上问题避免出现不必要的缺陷。 示例 一、C#观察者模式
以下是一个示例展示了如何在C#中实现观察者模式
//首先定义一个被观察者接口
public interface ISubject
{ void Register(IObserver observer); void Remove(IObserver observer); void Notify();
}
//然后定义一个具体被观察者类
public class ConcreteSubject : ISubject
{ private ListIObserver observers; private string state; public ConcreteSubject() { observers new ListIObserver(); } public void Register(IObserver observer) { observers.Add(observer); } public void Remove(IObserver observer) { observers.Remove(observer); } public void Notify() { foreach (var observer in observers) { observer.Update(state); } } public void SetState(string state) { this.state state; Notify(); }
}
//接下来定义一个观察者接口
public interface IObserver
{ void Update(string state);
}
//最后定义一个具体观察者类
public class ConcreteObserver : IObserver
{ private string name; public ConcreteObserver(string name) { this.name name; } public void Update(string state) { Console.WriteLine({0} received update and the new state is {1}, name, state); }
}
//接下来可以创建一个具体的被观察者和多个具体观察者并实现它们之间的交互
public static void Main(string[] args){ISubject subject new ConcreteSubject(); IObserver observer1 new ConcreteObserver(Observer 1);IObserver observer2 new ConcreteObserver(Observer 2); IObserver observer3 new ConcreteObserver(Observer 3); subject.Register(observer1); subject.Register(observer2); subject.Register(observer3); subject.SetState(New State);
}
在这个示例中我们创建了一个被观察者对象subject和一个观察者对象observer1、observer2和observer3。我们将这些观察者对象注册到被观察者对象subject中然后调用subject的SetState方法来改变其状态。当状态发生变化时所有注册的观察者都会自动收到通知并执行Update方法。 在这个例子中我们只是简单地打印出每个观察者的名称和新的状态。你可以根据自己的需求扩展这个示例。
二、java观察者模式
观察者模式通常通过以下方式实现
public interface Subject { void register(Observer observer); void remove(Observer observer); void notifyObservers(String message);
}
public class ConcreteSubject implements Subject { private ListObserver observers; private String message; public ConcreteSubject() { observers new ArrayList(); } Override public void register(Observer observer) { observers.add(observer); } Override public void remove(Observer observer) { observers.remove(observer); } Override public void notifyObservers(String message) { for (Observer observer : observers) { observer.update(message); } } public void setMessage(String message) { this.message message; notifyObservers(message); }
} public interface Observer { void update(String message);
}
class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name name; } Override public void update(String message) { System.out.println(name received update with message: message); }
}
public class Main { public static void main(String[] args) { Subject subject new ConcreteSubject(); Observer observer1 new ConcreteObserver(Observer 1); Observer observer2 new ConcreteObserver(Observer 2); Observer observer3 new ConcreteObserver(Observer 3); subject.register(observer1); subject.register(observer2); subject.register(observer3); subject.setMessage(Hello World!); }
}
三、javascript观察者模式
在JavaScript中实现观察者模式通常需要定义一个被观察者Subject和一个或多个观察者Observer。被观察者维护一个观察者列表并在状态发生变化时遍历这个列表并调用每个观察者的更新方法。
下面是一个简单的JavaScript观察者模式的代码示例
class Subject { constructor() { this.observers []; } subscribe(observer) { this.observers.push(observer); } unsubscribe(observer) { this.observers this.observers.filter(obs obs ! observer); } notify(message) { this.observers.forEach(observer observer.update(message)); }
} class Observer { constructor(name) { this.name name; } update(message) { console.log(${this.name} received update with message: ${message}); }
} // 使用示例
const subject new Subject();
const observer1 new Observer(Observer 1);
const observer2 new Observer(Observer 2);
const observer3 new Observer(Observer 3);
subject.subscribe(observer1);
subject.subscribe(observer2);
subject.subscribe(observer3);
subject.notify(Hello World!);
四、C观察者模式
以下是在C中实现观察者模式
//定义一个观察者接口
class Observer {
public: virtual void update(Subject* subject) 0;
};
//定义一个被观察者接口
class Subject {
public: virtual void registerObserver(Observer* observer) 0; virtual void removeObserver(Observer* observer) 0; virtual void notifyObservers() 0;
};
//创建一个具体被观察者类
class ConcreteSubject : public Subject {
private: std::vectorObserver* observers; public: void registerObserver(Observer* observer) override { observers.push_back(observer); } void removeObserver(Observer* observer) override { for (auto it observers.begin(); it ! observers.end(); it) { if (*it observer) { observers.erase(it); break; } } } void notifyObservers() override { for (auto observer : observers) { observer-update(this); } }
};
//创建一个具体观察者类
class ConcreteObserver : public Observer {
private: std::string name; public: ConcreteObserver(std::string name) : name(name) {} void update(Subject* subject) override { std::cout name received update. std::endl; }
};
//使用示例
int main() { ConcreteSubject subject; ConcreteObserver observer1(Observer 1); ConcreteObserver observer2(Observer 2); ConcreteObserver observer3(Observer 3); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.registerObserver(observer3); subject.notifyObservers(); // 输出Observer 1 received update. Observer 2 received update. Observer 3 received update. subject.removeObserver(observer2); // 删除一个观察者 subject.notifyObservers(); // 输出Observer 1 received update. Observer 3 received update. return 0;
}
五、python观察者模式
在Python中实现观察者模式通常需要定义一个被观察者类和一个或多个观察者类。被观察者类维护一个观察者列表并在状态发生变化时遍历这个列表并调用每个观察者的更新方法。 以下是在python中实现观察者模式
class Subject: def __init__(self): self._observers [] def attach(self, observer): self._observers.append(observer) def detach(self, observer): self._observers.remove(observer) def notify(self, valueNone): for observer in self._observers: observer.update(value) class Observer: def update(self, value): pass class ConcreteObserver(Observer): def update(self, value): print(fObserver received update with value: {value}) # 使用示例
subject Subject()
observer1 ConcreteObserver()
observer2 ConcreteObserver()
observer3 ConcreteObserver()
subject.attach(observer1)
subject.attach(observer2)
subject.attach(observer3)
subject.notify(100) # 输出Observer received update with value: 100 Observer received update with value: 100 Observer received update with value: 100
subject.detach(observer2) # 删除一个观察者
subject.notify(200) # 输出Observer received update with value: 200 Observer received update with value: 200
六、go观察者模式
以下是一个示例展示了如何在go中实现观察者模式
type Subject struct { observers []Observer
} func (s *Subject) Attach(observer Observer) { s.observers append(s.observers, observer)
} func (s *Subject) Notify() { for _, observer : range s.observers { observer.Update() }
} typeObserver interface { Update()
} typeConcreteObserver struct { name string
} func (o *ConcreteObserver) Update() { fmt.Printf(Observer %s received update.\n, o.name)
}
在这个示例中我们定义了一个被观察者结构体Subject它维护一个观察者列表observers。我们定义了一个Attach方法用于将一个观察者添加到观察者列表中以及一个Notify方法用于遍历观察者列表并调用每个观察者的Update方法。我们定义了一个观察者接口Observer它包含一个Update方法。最后我们创建了一个具体观察者结构体ConcreteObserver它实现了Observer接口的Update方法。在主函数中我们创建了一个被观察者对象subject和一个具体观察者对象observer并将它们分别添加到被观察者和观察者列表中。然后我们调用被观察者的Notify方法来通知所有注册的观察者状态变化。
七、PHP观察者模式
以下是一个示例展示了如何在PHP中实现观察者模式
//定义一个主题接口Subject
interface Subject { public function attach(Observer $observer); public function detach(Observer $observer); public function notify(Observer $observer);
}
//定义一个具体主题类ConcreteSubject
class ConcreteSubject implements Subject { private $observers []; private $state; public function attach(Observer $observer) { $this-observers[] $observer; } public function detach(Observer $observer) { $index array_search($observer, $this-observers); if ($index ! false) { unset($this-observers[$index]); } } public function notify(Observer $observer) { foreach ($this-observers as $observer) { $observer-update($this-state); } } public function setState($state) { $this-state $state; $this-notify($this-observers); }
}
//定义一个观察者接口Observer
interface Observer { public function update($state);
}
//定义一个具体观察者类ConcreteObserver
class ConcreteObserver implements Observer { private $name; public function __construct($name) { $this-name $name; } public function update($state) { echo Observer {$this-name} received update with state: {$state}\n; }
}// 创建具体观察者对象
$observer1 new ConcreteObserver(Observer 1);
$observer2 new ConcreteObserver(Observer 2);
$observer3 new ConcreteObserver(Observer 3); // 创建具体主题对象并附加观察者对象
$subject new ConcreteSubject();
$subject-attach($observer1);
$subject-attach($observer2);
$subject-attach($observer3); // 设置主题状态并通知观察者对象更新状态信息
$subject-setState(new state); 《完结》 文章转载自: http://www.morning.ljygq.cn.gov.cn.ljygq.cn http://www.morning.fqmbt.cn.gov.cn.fqmbt.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.nzmqn.cn.gov.cn.nzmqn.cn http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn http://www.morning.mcpdn.cn.gov.cn.mcpdn.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.lxhgj.cn.gov.cn.lxhgj.cn http://www.morning.vibwp.cn.gov.cn.vibwp.cn http://www.morning.plqqp.cn.gov.cn.plqqp.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn http://www.morning.rknhd.cn.gov.cn.rknhd.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.jxrpn.cn.gov.cn.jxrpn.cn http://www.morning.hsflq.cn.gov.cn.hsflq.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.qbdqc.cn.gov.cn.qbdqc.cn http://www.morning.lqljj.cn.gov.cn.lqljj.cn http://www.morning.dsmwy.cn.gov.cn.dsmwy.cn http://www.morning.rynq.cn.gov.cn.rynq.cn http://www.morning.snygg.cn.gov.cn.snygg.cn http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.djgrg.cn.gov.cn.djgrg.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.wbysj.cn.gov.cn.wbysj.cn http://www.morning.ntyanze.com.gov.cn.ntyanze.com http://www.morning.ypzsk.cn.gov.cn.ypzsk.cn http://www.morning.yqlrq.cn.gov.cn.yqlrq.cn http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.lyjwb.cn.gov.cn.lyjwb.cn http://www.morning.kkysz.cn.gov.cn.kkysz.cn http://www.morning.gcjhh.cn.gov.cn.gcjhh.cn http://www.morning.tjmfz.cn.gov.cn.tjmfz.cn http://www.morning.xprq.cn.gov.cn.xprq.cn http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn http://www.morning.tqsmg.cn.gov.cn.tqsmg.cn http://www.morning.lslin.com.gov.cn.lslin.com http://www.morning.dktyc.cn.gov.cn.dktyc.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.kaakyy.com.gov.cn.kaakyy.com http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.dqxnd.cn.gov.cn.dqxnd.cn http://www.morning.qhqgk.cn.gov.cn.qhqgk.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.fnhxp.cn.gov.cn.fnhxp.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.dkfrd.cn.gov.cn.dkfrd.cn http://www.morning.dkgtr.cn.gov.cn.dkgtr.cn http://www.morning.cwwts.cn.gov.cn.cwwts.cn http://www.morning.pbksb.cn.gov.cn.pbksb.cn http://www.morning.fslrx.cn.gov.cn.fslrx.cn http://www.morning.rglp.cn.gov.cn.rglp.cn http://www.morning.dsxgc.cn.gov.cn.dsxgc.cn http://www.morning.ntyanze.com.gov.cn.ntyanze.com http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.nzklw.cn.gov.cn.nzklw.cn http://www.morning.kllzy.com.gov.cn.kllzy.com http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn http://www.morning.psdsk.cn.gov.cn.psdsk.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn http://www.morning.prgnp.cn.gov.cn.prgnp.cn http://www.morning.hbpjb.cn.gov.cn.hbpjb.cn http://www.morning.jwncx.cn.gov.cn.jwncx.cn http://www.morning.hqpyt.cn.gov.cn.hqpyt.cn