关于建设教体局网站的申请,免费秒玩小游戏,项目计划书模板范文 完整版,免费建筑设计素材网站2019独角兽企业重金招聘Python工程师标准 观察者模式 当对象间存在一对多关系时#xff0c;则使用观察者模式#xff08;Observer Pattern#xff09;。比如#xff0c;当一个对象被修改时#xff0c;则会自动通知它的依赖对象。观察者模式属于行为型模式。… 2019独角兽企业重金招聘Python工程师标准 观察者模式 当对象间存在一对多关系时则使用观察者模式Observer Pattern。比如当一个对象被修改时则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。 主要解决一个对象状态改变给其他对象通知的问题而且要考虑到易用和低耦合保证高度的协作。 何时使用一个对象目标对象的状态发生改变所有的依赖对象观察者对象都将得到通知进行广播通知。 如何解决使用面向对象技术可以将这种依赖关系弱化。 关键代码在抽象类里有一个 ArrayList 存放观察者们。 应用实例 1、拍卖的时候拍卖师观察最高标价然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿菩萨洒了一地水招来一个老乌龟这个乌龟就是观察者他观察菩萨洒水这个动作。 优点 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点 1、如果一个被观察者对象有很多的直接和间接的观察者的话将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话观察目标会触发它们之间进行循环调用可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的而仅仅只是知道观察目标发生了变化。 使用场景 一个抽象模型有两个方面其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。一个对象的改变将导致其他一个或多个对象也发生改变而不知道具体有多少对象将发生改变可以降低对象之间的耦合度。一个对象必须通知其他对象而并不知道这些对象是谁。需要在系统中创建一个触发链A对象的行为将影响B对象B对象的行为将影响C对象……可以使用观察者模式创建一种链式触发机制。注意事项 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行某一观察者错误会导致系统卡壳一般采用异步方式。 实现 观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。 ObserverPatternDemo我们的演示类使用 Subject 和实体类对象来演示观察者模式。 步骤 1 创建 Subject 类。 // 被观察者
class Subject{
private:listObserver * _observers;int _state;public:int GetState(){return _state;}void SetState(int state){_state state;NotifyAllObservers();}void Attach(Observer * observer){_observers.push_back(observer);}void NotifyAllObservers(){listObserver*::iterator iter _observers.begin();for(;iter ! _observers.end();iter){(*iter)-update();}}
}; 步骤 2 创建 Observer 类。
class Subject;class Observer{
protected:Subject * _subject;public:Observer(Subject *subject) : _subject(subject) {}virtual ~Observer(){}virtual void update() 0;
};步骤 3 创建实体观察者类。 class BinaryObserver : public Observer{
public:BinaryObserver(Subject *subject) : Observer(subject) {_subject-Attach(this);}void update() override {std::cout Binary string : _subject-GetState() std::endl;}
};class OctalObserver : public Observer{
public:OctalObserver(Subject *subject) : Observer(subject) {_subject-Attach(this);}void update() override {std::cout Octal String: _subject-GetState() std::endl;}
};class HexaObserver : public Observer{
public:HexaObserver(Subject *subject) : Observer(subject) {_subject-Attach(this);}void update() override {std::cout Hex String: _subject-GetState() std::endl;}
}; 步骤 4 使用 Subject 和实体观察者对象。 Subject * subject new Subject();Observer * o1 new BinaryObserver(subject);Observer * o2 new OctalObserver(subject);Observer * o3 new HexaObserver(subject);subject-SetState(1);subject-SetState(3); 步骤 5 验证输出。 Binary string :1
Octal String:1
Hex String:1
Binary string :3
Octal String:3
Hex String:3转载于:https://my.oschina.net/fileoptions/blog/1823508