zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式又叫发布订阅模式(publish/subscribe)、模型视图模式(model/view)、源/监听器模式(source/listener),它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。下面是不同编程语言实现的实例。

    1、java实现

    package com.sample;
    import java.util.List;
    import java.util.ArrayList;
    public class ObserverDemo {
        public static void main(String[] args) {
            Subject subject = new Subject();
            Observer observer = new Observer();
            subject.attach(observer);
            subject.notify("hello");
        }
    }
    class Subject {
        private List<Observer> observerList = new ArrayList<Observer>();
        public void attach(Observer observer) {
            observerList.add(observer);
            System.out.println("attached an observer");
        }
        public void detach(Observer observer) {
            observerList.remove(observer);
        }
        public void notify(String state) {
            for (Observer observer : observerList) {
                observer.update(state);
            }
        }
    }
    class Observer {
        public void update(String state) {
            System.out.println("state is: " + state);
        }
    }

    2、C++实现

    observer.h

    #ifndef _OBSERVER_H_
    #define _OBSERVER_H_
    #include <string>
    #include <list>
    using namespace std;
    class Subject;
    class Observer
    {
        public:
            void update(string state);
    };
    class Subject
    {
        public:
            void notify(string state);
            void attach(Observer*);
            void Detach(Observer*);
        private:
            list<Observer*> observerList;
    }
    #endif

    observer.cpp

    #include <iostream>
    #include <algorithm>
    
    #include "observer.h"
    void Observer::update(string state)
    {
        cout<<"state is: "<<state<<endl;
    }
    void Subject::attach(Observer* pobs)
    {
        this->observerList.push_back(pobs);
        cout<<"attach an observer
    ";
    }
    void Subject::detach(Observer* pobs)
    {
        list<Observer*>::iterator iter;
        iter = find(observerList.begin(), observerList.end(), pobs);
        if (iter != observerList.end())
        {
            observerList.erase(iter);
        }
        cout<<"detach an observer
    ";
    }
    void Subject::notify(string state)
    {
        list<Observer*>::iterator iter = this->observerList.begin();
        for (; iter != observerList.end(); iter++)
        {
            (*iter)->update(state);
        }
    }
    Subject::~Subject()
    {
        list<Observer*>::iterator iter = this->observerList.begin();
        for (; iter != observerList.end(); iter++)
        {
            delete *iter;
        }
        observerList.clear();
    }
    int main(int argc, char** argv)
    {
        Observer* p1 = new Observer();
        Observer* p2 = new Observer();
        Observer* p3 = new Observer();
        Subject* pSubject = new Subject();
        pSubject->attach(p1);
        pSubject->attach(p2);
        pSubject->attach(p3);
        pSubject->notify("hello");
        return 0;
    }

    3、javascript实现

     http://www.cnblogs.com/TomXu/archive/2012/03/02/2355128.html

  • 相关阅读:
    第二周总结
    第一次结组作业概述
    Spring_Bean的自动装配
    Spring_依赖注入
    Spring_配置
    第一周总结
    1680. Concatenation of Consecutive Binary Numbers
    1631. Path With Minimum Effort
    1657. Determine if Two Strings Are Close
    1673. Find the Most Competitive Subsequence
  • 原文地址:https://www.cnblogs.com/feilv/p/4151552.html
Copyright © 2011-2022 走看看