美文网首页
观察者模式

观察者模式

作者: 张霸天 | 来源:发表于2017-03-14 10:29 被阅读0次

第一版,耦合比较严重



//.h
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

class StockObserver;



class Secretary {
private:
    
    list<StockObserver *>  observers ;
    
    string action;
    
    
public:
    
    void Attach(StockObserver * observer){
        observers.push_back(observer);
    }
    
    void Notify() ;
    
    string getSecretaryAction(){
        return action;
    }
    
    void SecretaryAction(string value) {
        action = value;
    }
    
};


class StockObserver {
    
private:
    string name;
    Secretary * sub;
public:
    StockObserver(string name,Secretary * sub):name(name),sub(sub){};
    
    void update(){
        cout<<"close the website ,back work"<<endl;
    };
};

//.m
void Secretary::Notify() {
        list<StockObserver *>::iterator itor;
        itor = observers.begin();
        while (itor != observers.end()) {
            (*(*itor)).update();
            itor++;
        }
}

第二版,观察者抽象


#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

class Secretary;

class Observer {
protected:
    string name;
    Secretary * sub;
    
public:
    Observer(string name,Secretary * sub):name(name),sub(sub){};
    ~Observer(){};
    virtual void Update(){};
};


class Secretary  {
private:
    
    list<Observer *>  observers ;
    
    string action;
    
    
public:
    
    void Attach(Observer * observer){
        observers.push_back(observer);
    }
    
    void Detach(Observer * observer) {
        observers.remove(observer);
    }
    
    void Notify() ;
    
    string getSecretaryAction(){
        return action;
    }
    
    void SecretaryAction(string value) {
        action = value;
    }
    
};


class StockObserver:public Observer {

public:
    StockObserver (string name,Secretary * sub):Observer(name,sub){};
    void Update(){
        cout<<sub->getSecretaryAction()<<name<<"close stock website,back work"<<endl;
    }
};

class NBAObserver:public Observer {
    
public:
    NBAObserver(string name,Secretary * sub):Observer(name,sub){};
    void Update(){
        cout<<sub->getSecretaryAction()<<name<<"close nba website,back work"<<endl;
    }
};

//.m
void Secretary::Notify() {
        list<Observer *>::iterator itor;
        itor = observers.begin();
        while (itor != observers.end()) {
            (*(*itor)).Update();
            itor++;
        }
}



第三次解耦 观察者和通知者都分离了


#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

class Subject;

class Observer {
protected:
    string name;
    Subject * sub;
    
public:
    Observer(string name,Subject * sub):name(name),sub(sub){};
    ~Observer(){};
    virtual void Update(){};
};

class Subject {
    
public:
    virtual void Attach(Observer * observer){};
    virtual void Detach(Observer * observer){};
    virtual void Notify(){};
    virtual string getSubjectState(){ return nullptr;};
    virtual void SubjectState(string substate){};
};

class Boss:public Subject {

private:
    list<Observer *> observers;
    string action;
    

public:
    void Attach(Observer * observer){
        observers.push_back(observer);
    }
    
    void Detach(Observer * observer) {
        observers.remove(observer);
    }
    
    void Notify() {
        list<Observer *>::iterator itor;
        itor = observers.begin();
        while (itor != observers.end()) {
            (*(*itor)).Update();
            itor++;
        }
    }
    string getSubjectState(){ return action;}
    
    void SubjectState(string substate){action = substate;};
  
};

class StockObserver:public Observer {

public:
    StockObserver (string name,Subject * sub):Observer(name,sub){};
    void Update(){
        cout<<sub->getSubjectState()<<name<<"close stock website,back work"<<endl;
    }
};

class NBAObserver:public Observer {
    
public:
    NBAObserver(string name,Subject * sub):Observer(name,sub){};
    void Update(){
        cout<<sub->getSubjectState()<<name<<"close nba website,back work"<<endl;
    }
};


重要概念

将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性,我们不希望为了维持一致性而使各类紧密耦合。

当一个对象不知道具体有多少对象会受到改变时,考虑使用观察者模式
观察者模式主要的工作就是解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使各自的变化都不会影响另一边的变化

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

      本文链接:https://www.haomeiwen.com/subject/uvecnttx.html