定義:
在對象之間定義一對多的關係,這樣一來,當一個對象改變狀態,所有依賴他的對象都會收到通知,並自動更新。
(在此模式中,一個目標物件管理所有相依於它的觀察者物件。並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的的方法來實現。觀察者模式有時又被成爲模型-視圖(Model-View)模式,源-收聽者(Listenr)模式或者從屬模式)
UML類圖:
C++實現:
C++:
#include<iostream>
#include<list>
using namespace std;
class Observer;
class Subject
{
public:
virtual void registerObserver(Observer*) = 0;
virtual void removeObserver(Observer*) = 0;
virtual void notifyObserver() = 0;
};
class Observer
{
public:
virtual void update() = 0;
};
class ConcreteSubject :public Subject
{
list<Observer*> observers;
int State;
public:
// 通過 Subject 繼承
virtual void registerObserver(Observer* observer) override
{
this->observers.push_back(observer);
}
virtual void removeObserver(Observer * observer) override
{
this->observers.remove(observer);
}
virtual void notifyObserver() override
{
for (Observer* observer : observers)
{
observer->update();
}
}
int getState()
{
return this->State;
}
void setState(int state)
{
this->State = state;
}
};
class ConcreteObserver :public Observer
{
Subject* subject;
public:
ConcreteObserver(Subject* subject)
{
this->subject = subject;
}
// 通過 Observer 繼承
virtual void update() override
{
cout << "update excute" << endl;
}
};
int main()
{
ConcreteSubject* subject = new ConcreteSubject();
ConcreteObserver* observer = new ConcreteObserver(subject);
subject->registerObserver(observer);
subject->notifyObserver();
return 0;
}
C#實現:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using static System.Console;
namespace ConsoleApp1
{
interface Subject
{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
interface Observer
{
void update();
}
class ConcreteSubject : Subject
{
List<Observer> observers=new List<Observer>();
int State;
public void notifyObserver()
{
foreach(Observer observer in observers)
{
observer.update();
}
}
public void registerObserver(Observer observer)
{
observers.Add(observer);
}
public void removeObserver(Observer observer)
{
observers.Remove(observer);
}
public int getState()
{
return State;
}
public void setState(int State)
{
this.State = State;
notifyObserver();
}
}
class ConcreteObserver : Observer
{
Subject subject;
public ConcreteObserver(Subject subject)
{
this.subject = subject;
}
public void update()
{
WriteLine("update excute");
}
}
class Program
{
static void Main(string[] args)
{
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver(subject);
subject.registerObserver(observer);
subject.notifyObserver();
}
}
}