Head first笔记二:观察者模式

来源:互联网 发布:adobeacrobat9pro mac 编辑:程序博客网 时间:2024/06/16 02:08






Headfirst Java代码

public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();}public interface Observer {public void update(float temp, float humidity, float pressure);}public interface DisplayElement {public void display();}public class WeatherData implements Subject {private ArrayList observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);}}public void notifyObservers() {for (int i = 0; i < observers.size(); i++) {Observer observer = (Observer)observers.get(i);observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}// other WeatherData methods here}public class CurrentConditionsDisplay implements Observer, DisplayElement {private float temperature;private float humidity;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;display();}public void display() {System.out.println(“Current conditions: “ + temperature+ “F degrees and “ + humidity + “% humidity”);}}public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentDisplay =new CurrentConditionsDisplay(weatherData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);weatherData.setMeasurements(78, 90, 29.2f);}}

C++ 例子:

#include <iostream>#include <list>using namespace std; class Observer{public:     virtual void Update(int) = 0;}; class Subject{public:     virtual void Attach(Observer *) = 0;     virtual void Detach(Observer *) = 0;     virtual void Notify() = 0;}; class ConcreteObserver : public Observer{public:     ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}      void Update(int value)     {          cout<<"ConcreteObserver get the update. New State:"<<value<<endl;     } private:     Subject *m_pSubject;}; class ConcreteObserver2 : public Observer{public:     ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}      void Update(int value)     {          cout<<"ConcreteObserver2 get the update. New State:"<<value<<endl;     } private:     Subject *m_pSubject;}; class ConcreteSubject : public Subject{public:     void Attach(Observer *pObserver);     void Detach(Observer *pObserver);     void Notify();      void SetState(int state)     {          m_iState = state;     } private:     std::list<Observer *> m_ObserverList;     int m_iState;}; void ConcreteSubject::Attach(Observer *pObserver){     m_ObserverList.push_back(pObserver);} void ConcreteSubject::Detach(Observer *pObserver){     m_ObserverList.remove(pObserver);} void ConcreteSubject::Notify(){     std::list<Observer *>::iterator it = m_ObserverList.begin();     while (it != m_ObserverList.end())     {          (*it)->Update(m_iState);          ++it;     }} int main(){     // Create Subject     ConcreteSubject *pSubject = new ConcreteSubject();      // Create Observer     Observer *pObserver = new ConcreteObserver(pSubject);     Observer *pObserver2 = new ConcreteObserver2(pSubject);      // Change the state     pSubject->SetState(2);      // Register the observer     pSubject->Attach(pObserver);     pSubject->Attach(pObserver2);      pSubject->Notify();      // Unregister the observer     pSubject->Detach(pObserver);      pSubject->SetState(3);     pSubject->Notify();      delete pObserver;     delete pObserver2;     delete pSubject;}


0 0
原创粉丝点击