Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fefa85e

Browse files
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

‎ObserverPattern/ObserverPattern.csproj

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)

AltStyle によって変換されたページ (->オリジナル) /