Skip to content

Commit fefa85e

Browse files
committed
observer pattern example
1 parent a0914b1 commit fefa85e

File tree

3 files changed

+135
-0
lines changed

3 files changed

+135
-0
lines changed

DesignPatterns.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediatorPattern", "Mediator
3737
EndProject
3838
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MementoPattern", "Memento\MementoPattern.csproj", "{93F0318A-696F-4C09-800F-7091BAEC2178}"
3939
EndProject
40+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObserverPattern", "ObserverPattern\ObserverPattern.csproj", "{88754C6C-4DA4-4C4B-8E53-4DDD9425A387}"
41+
EndProject
4042
Global
4143
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4244
Debug|Any CPU = Debug|Any CPU
@@ -111,6 +113,10 @@ Global
111113
{93F0318A-696F-4C09-800F-7091BAEC2178}.Debug|Any CPU.Build.0 = Debug|Any CPU
112114
{93F0318A-696F-4C09-800F-7091BAEC2178}.Release|Any CPU.ActiveCfg = Release|Any CPU
113115
{93F0318A-696F-4C09-800F-7091BAEC2178}.Release|Any CPU.Build.0 = Release|Any CPU
116+
{88754C6C-4DA4-4C4B-8E53-4DDD9425A387}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
117+
{88754C6C-4DA4-4C4B-8E53-4DDD9425A387}.Debug|Any CPU.Build.0 = Debug|Any CPU
118+
{88754C6C-4DA4-4C4B-8E53-4DDD9425A387}.Release|Any CPU.ActiveCfg = Release|Any CPU
119+
{88754C6C-4DA4-4C4B-8E53-4DDD9425A387}.Release|Any CPU.Build.0 = Release|Any CPU
114120
EndGlobalSection
115121
GlobalSection(SolutionProperties) = preSolution
116122
HideSolutionNode = FALSE
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp2.0</TargetFramework>
6+
</PropertyGroup>
7+
8+
</Project>

ObserverPattern/Program.cs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace ObserverPattern
5+
{
6+
class JobPost
7+
{
8+
public string Title { get; private set; }
9+
10+
public JobPost(string title)
11+
{
12+
Title = title;
13+
}
14+
}
15+
class JobSeeker : IObserver<JobPost>
16+
{
17+
public string Name { get; private set; }
18+
19+
public JobSeeker(string name)
20+
{
21+
Name = name;
22+
}
23+
24+
//Method is not being called by JobPostings class currently
25+
public void OnCompleted()
26+
{
27+
//No Implementation
28+
}
29+
30+
//Method is not being called by JobPostings class currently
31+
public void OnError(Exception error)
32+
{
33+
//No Implementation
34+
}
35+
36+
public void OnNext(JobPost value)
37+
{
38+
Console.WriteLine("Hi {0} ! New job posted: {1}", Name, value.Title);
39+
}
40+
}
41+
42+
class JobPostings : IObservable<JobPost>
43+
{
44+
private List<IObserver<JobPost>> mObservers;
45+
private List<JobPost> mJobPostings;
46+
47+
public JobPostings()
48+
{
49+
mObservers = new List<IObserver<JobPost>>();
50+
mJobPostings = new List<JobPost>();
51+
}
52+
53+
public IDisposable Subscribe(IObserver<JobPost> observer)
54+
{
55+
// Check whether observer is already registered. If not, add it
56+
if (!mObservers.Contains(observer))
57+
{
58+
mObservers.Add(observer);
59+
}
60+
return new Unsubscriber<JobPost>(mObservers, observer);
61+
}
62+
63+
private void Notify(JobPost jobPost)
64+
{
65+
foreach(var observer in mObservers)
66+
{
67+
observer.OnNext(jobPost);
68+
}
69+
}
70+
71+
public void AddJob(JobPost jobPost)
72+
{
73+
mJobPostings.Add(jobPost);
74+
Notify(jobPost);
75+
}
76+
77+
}
78+
79+
internal class Unsubscriber<JobPost> : IDisposable
80+
{
81+
private List<IObserver<JobPost>> mObservers;
82+
private IObserver<JobPost> mObserver;
83+
84+
internal Unsubscriber(List<IObserver<JobPost>> observers, IObserver<JobPost> observer)
85+
{
86+
this.mObservers = observers;
87+
this.mObserver = observer;
88+
}
89+
90+
public void Dispose()
91+
{
92+
if (mObservers.Contains(mObserver))
93+
mObservers.Remove(mObserver);
94+
}
95+
}
96+
97+
98+
class Program
99+
{
100+
static void Main(string[] args)
101+
{
102+
//Create Subscribers
103+
var johnDoe = new JobSeeker("John Doe");
104+
var janeDoe = new JobSeeker("Jane Doe");
105+
106+
//Create publisher and attch subscribers
107+
var jobPostings = new JobPostings();
108+
jobPostings.Subscribe(johnDoe);
109+
jobPostings.Subscribe(janeDoe);
110+
111+
//Add a new job and see if subscribers get notified
112+
jobPostings.AddJob(new JobPost("Software Engineer"));
113+
114+
//Output
115+
// Hi John Doe! New job posted: Software Engineer
116+
// Hi Jane Doe! New job posted: Software Engineer
117+
118+
Console.ReadLine();
119+
}
120+
}
121+
}

0 commit comments

Comments
 (0)