Observer pattern is very commonly used design pattern ; and it is used to notify objects if some changes happens in another object.

Here objects to be notified are called observers and the object where change happens is called subject.Observer pattern is otherwise know as publish subscriber pattern.In observer pattern observers needs to be registered to the subject and if some changes happens in subject it notifies observers.
Observer pattern avoid the polling of subject for changes.Observer pattern has a lot of applications in software word.for eg: Java event handling, QT signal-slot mechanisms etc are based on observer pattern.
so main players in observer pattern is
1) Subject
Central object where chnages or events happens; during this time it has to be notified.
Subject provides API to register for listeners and to notify listeners.
2)Observers
Objects to be notified upon changes or events happening subjects.
Suppose I am writing a File Monitoring application where I need to notify Listeners when some file changes happens in A directory.
File changes can be Adding a file,removing a file,updating a file,accessing a file etc.
class diagram is shown below

sample code is shown below
// ObserverPatternSample.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "pch.h"
#include
#include
#include
using namespace std;
class IFileSystemListener
{
public:
enum class FILECHANGE
{
FILE_ADDED,
FILE_REMOVED,
FILE_UPDATED
};
virtual ~IFileSystemListener() {}
virtual void OnFileChange(FILECHANGE type) = 0;
};
class FileSystemListener: public IFileSystemListener
{
public:
void OnFileChange(IFileSystemListener::FILECHANGE type)
{
cout <OnFileChange(IFileSystemListener::FILECHANGE::FILE_ADDED);
}
}
void OnFileRemove()
{
for (auto& listener : m_Listeners) {
listener->OnFileChange(IFileSystemListener::FILECHANGE::FILE_REMOVED);
}
}
void OnFileUpdate()
{
for (auto& listener : m_Listeners) {
listener->OnFileChange(IFileSystemListener::FILECHANGE::FILE_UPDATED);
}
}
void AddFileChangeListener(IFileSystemListener* listener)
{
m_Listeners.push_back(listener);
}
void RemoveChangeListener(IFileSystemListener* listener)
{
// m_Listeners.erase(listener);
}
private:
vector m_Listeners;
wstring m_sPath;
};
int main()
{
/* Listener Objects */
IFileSystemListener* pListener = new FileSystemListener();
/*Creating FileSystem Monitor*/
FileSystemMonitor monitor(L"D:\\Log");
/*Registering File Chnage Listener*/
monitor.AddFileChangeListener(pListener);
//Explicittly calling file changes
monitor.OnFileAdd();
monitor.OnFileRemove();
delete pListener;
}
VS 2017 Source Code can be downloaded from:download