diff --git a/Observer/IPublisher.cs b/Observer/IPublisher.cs
new file mode 100644
index 0000000..c139146
--- /dev/null
+++ b/Observer/IPublisher.cs
@@ -0,0 +1,8 @@
+public interface IPublisher
+{
+ void Subscribe(ISubscriber subscriber);
+
+ void Unsubscribe(ISubscriber subscriber);
+
+ void Notify();
+}
\ No newline at end of file
diff --git a/Observer/ISubscriber.cs b/Observer/ISubscriber.cs
new file mode 100644
index 0000000..ae39ef6
--- /dev/null
+++ b/Observer/ISubscriber.cs
@@ -0,0 +1,5 @@
+public interface ISubscriber
+{
+ string Name { get; }
+ void Update(IPublisher subject);
+}
\ No newline at end of file
diff --git a/Observer/Observer.csproj b/Observer/Observer.csproj
new file mode 100644
index 0000000..d439800
--- /dev/null
+++ b/Observer/Observer.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net7.0
+ enable
+ enable
+
+
+
diff --git a/Observer/Program.cs b/Observer/Program.cs
new file mode 100644
index 0000000..43d27e4
--- /dev/null
+++ b/Observer/Program.cs
@@ -0,0 +1,16 @@
+
+var publisher = new Publisher();
+
+var subscriberA = new Subscriber("Alex");
+publisher.Subscribe(subscriberA);
+
+var subscriberB = new Subscriber("Bob");
+publisher.Subscribe(subscriberB);
+
+publisher.PublishNewsletter();
+publisher.PublishNewsletter();
+publisher.PublishNewsletter();
+
+publisher.Unsubscribe(subscriberB);
+
+publisher.PublishNewsletter();
diff --git a/Observer/Publisher.cs b/Observer/Publisher.cs
new file mode 100644
index 0000000..ef81d3c
--- /dev/null
+++ b/Observer/Publisher.cs
@@ -0,0 +1,35 @@
+public class Publisher : IPublisher
+{
+ public int IssueNumber { get; set; } = 0;
+
+ private List _subscribers = new List();
+
+ public void Subscribe(ISubscriber subscriber)
+ {
+ Console.WriteLine($"Publisher: {subscriber.Name} just subscribed");
+ _subscribers.Add(subscriber);
+ }
+
+ public void Unsubscribe(ISubscriber subscriber)
+ {
+ _subscribers.Remove(subscriber);
+ Console.WriteLine($"Publisher: {subscriber.Name} just unsubscribed");
+ }
+
+ public void Notify()
+ {
+ Console.WriteLine("Publisher: Notify subscribers...");
+
+ foreach (var subscriber in _subscribers)
+ {
+ subscriber.Update(this);
+ }
+ }
+
+ public void PublishNewsletter()
+ {
+ this.IssueNumber++;
+ Console.WriteLine($"Published #{this.IssueNumber} of Newsletter");
+ this.Notify();
+ }
+}
\ No newline at end of file
diff --git a/Observer/Subscriber.cs b/Observer/Subscriber.cs
new file mode 100644
index 0000000..3cabbaf
--- /dev/null
+++ b/Observer/Subscriber.cs
@@ -0,0 +1,24 @@
+public class Subscriber : ISubscriber
+{
+ private int _latestIssue = 0;
+
+ public Subscriber(string name)
+ {
+ Name = name ?? throw new ArgumentNullException(nameof(name));
+ }
+
+ public string Name
+ {
+ get; private set;
+ }
+
+ public void Update(IPublisher publisher)
+ {
+ var concretePublisher = (publisher as Publisher);
+ if (concretePublisher.IssueNumber > _latestIssue)
+ {
+ _latestIssue = concretePublisher.IssueNumber;
+ Console.WriteLine($"{Name}: Received Issue {_latestIssue}");
+ }
+ }
+}
\ No newline at end of file