diff --git a/DesignPatternGuru/DesignPatternGuru.sln b/DesignPatternGuru/DesignPatternGuru.sln index 7aae73b..8d53d42 100644 --- a/DesignPatternGuru/DesignPatternGuru.sln +++ b/DesignPatternGuru/DesignPatternGuru.sln @@ -43,6 +43,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mediator", "Mediator\Mediat EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Memonto", "Memonto\Memonto.csproj", "{A6E39678-6214-4BD2-B616-A3350340E5AB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Observer", "Observer\Observer.csproj", "{EB189FAC-7C63-48BB-92D7-3C35A277EA1D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +119,10 @@ Global {A6E39678-6214-4BD2-B616-A3350340E5AB}.Debug|Any CPU.Build.0 = Debug|Any CPU {A6E39678-6214-4BD2-B616-A3350340E5AB}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6E39678-6214-4BD2-B616-A3350340E5AB}.Release|Any CPU.Build.0 = Release|Any CPU + {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB189FAC-7C63-48BB-92D7-3C35A277EA1D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -139,6 +145,7 @@ Global {6619433E-476B-404C-94A0-D0C0FE52DE41} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {08D296F6-6698-4FCB-B605-318D9381F975} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} {A6E39678-6214-4BD2-B616-A3350340E5AB} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} + {EB189FAC-7C63-48BB-92D7-3C35A277EA1D} = {E3B8A482-1A9A-4B6E-8310-050A44C8E379} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E5A9C6B-2E8A-466E-B5E0-4379902EFFAC} diff --git a/DesignPatternGuru/Observer/Observer.csproj b/DesignPatternGuru/Observer/Observer.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/DesignPatternGuru/Observer/Observer.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/DesignPatternGuru/Observer/Observers/ConcreteObserverA.cs b/DesignPatternGuru/Observer/Observers/ConcreteObserverA.cs new file mode 100644 index 0000000..92485dc --- /dev/null +++ b/DesignPatternGuru/Observer/Observers/ConcreteObserverA.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Observer.Observers +{ + internal class ConcreteObserverA : IObserver + { + public void Update(ISubject subject) + { + if ((subject as Subject).State < 3) + Console.WriteLine("ConcreteObserverA: Reacted to the event."); + } + } +} diff --git a/DesignPatternGuru/Observer/Observers/ConcreteObserverB.cs b/DesignPatternGuru/Observer/Observers/ConcreteObserverB.cs new file mode 100644 index 0000000..7b169d9 --- /dev/null +++ b/DesignPatternGuru/Observer/Observers/ConcreteObserverB.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Observer.Observers +{ + internal class ConcreteObserverB : IObserver + { + public void Update(ISubject subject) + { + if ((subject as Subject).State == 0 || (subject as Subject).State >= 2) + Console.WriteLine("ConcreteObserverB: Reacted to the event."); + } + } +} diff --git a/DesignPatternGuru/Observer/Observers/IObserver.cs b/DesignPatternGuru/Observer/Observers/IObserver.cs new file mode 100644 index 0000000..f0d322c --- /dev/null +++ b/DesignPatternGuru/Observer/Observers/IObserver.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Observer.Observers +{ + internal interface IObserver + { + void Update(ISubject subject); + } +} diff --git a/DesignPatternGuru/Observer/Observers/ISubject.cs b/DesignPatternGuru/Observer/Observers/ISubject.cs new file mode 100644 index 0000000..e46defc --- /dev/null +++ b/DesignPatternGuru/Observer/Observers/ISubject.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Observer.Observers +{ + internal interface ISubject + { + void Attach(IObserver observer); + + void Detach(IObserver observer); + + void Notify(); + } +} diff --git a/DesignPatternGuru/Observer/Observers/Subject.cs b/DesignPatternGuru/Observer/Observers/Subject.cs new file mode 100644 index 0000000..323737d --- /dev/null +++ b/DesignPatternGuru/Observer/Observers/Subject.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Observer.Observers +{ + internal class Subject : ISubject + { + public int State { get; set; } = -0; + + private List _observers = new List(); + + public void Attach(IObserver observer) + { + _observers.Add(observer); + Console.WriteLine("Subject: Attached an observers."); + } + + public void Detach(IObserver observer) + { + _observers.Remove(observer); + Console.WriteLine("Subject: Detached an observers."); + } + + public void Notify() + { + Console.WriteLine("Subject: Notifying observers..."); + foreach (IObserver observer in _observers) + { + observer.Update(this); + } + } + + public void SomeBusinessLogic() + { + Console.WriteLine(); + Console.WriteLine("Subject: I'm doing something important."); + this.State = new Random().Next(0, 10); + + Thread.Sleep(15); + + Console.WriteLine($"Subject: My state has just changed to: {this.State}"); + Notify(); + } + } +} diff --git a/DesignPatternGuru/Observer/Program.cs b/DesignPatternGuru/Observer/Program.cs new file mode 100644 index 0000000..a1a2551 --- /dev/null +++ b/DesignPatternGuru/Observer/Program.cs @@ -0,0 +1,25 @@ +using Observer.Observers; + +namespace Observer +{ + internal class Program + { + static void Main(string[] args) + { + var subject = new Subject(); + + var observerA = new ConcreteObserverA(); + subject.Attach(observerA); + + var observerB = new ConcreteObserverB(); + subject.Attach(observerB); + + subject.SomeBusinessLogic(); + subject.SomeBusinessLogic(); + + subject.Detach(observerB); + + subject.SomeBusinessLogic(); + } + } +} \ No newline at end of file