diff --git a/src/BehavioralPatterns/Program.cs b/src/BehavioralPatterns/Program.cs index 1c85a69..dae27ea 100644 --- a/src/BehavioralPatterns/Program.cs +++ b/src/BehavioralPatterns/Program.cs @@ -16,8 +16,10 @@ namespace BehavioralPatterns public class Program { public static void Main(string[] args) - { + { + ObserverPatternExamples.Run(); + Console.ReadKey(); //Chain of responsibillity //This is usefull when you have a request and you don't know who should process it ChainOfResponsibillityExamples.Run(); @@ -40,10 +42,6 @@ namespace BehavioralPatterns Console.ReadKey(); MementoPatternExamples.Run(); - - - ObserverPatternExamples.Run(); - Console.ReadKey(); } } } diff --git a/src/ObserverPattern/Twits/ObservableTwitsExample.cs b/src/ObserverPattern/Twits/ObservableTwitsExample.cs index d36add6..aeff52f 100644 --- a/src/ObserverPattern/Twits/ObservableTwitsExample.cs +++ b/src/ObserverPattern/Twits/ObservableTwitsExample.cs @@ -11,21 +11,16 @@ namespace ObserverPattern.Twits { TwitObservable observable = new TwitObservable(); - TwitUser t100 = new TwitUser("t100"); - TwitUser r2d2 = new TwitUser("r2d2"); - - var t100Subscription = observable.Subscribe(t100); - var r2d2Subscription = observable.Subscribe(r2d2); + TwitUser t100 = new TwitUser("t100", observable); + TwitUser r2d2 = new TwitUser("R2-D2", observable); - observable.AddTwit("El chupacapra"); + t100.Twit("El chupacapra - BOOM BOOM"); - t100Subscription.Dispose(); + r2d2.Twit("Vamos vamos mi amor"); - observable.AddTwit("Vamos vamos mi amor"); + t100.Dispose(); - observable.ItsGoingHomeTime(); - - + observable.ItsGoingHomeTime(); } } } diff --git a/src/ObserverPattern/Twits/Twit.cs b/src/ObserverPattern/Twits/Twit.cs new file mode 100644 index 0000000..72138f6 --- /dev/null +++ b/src/ObserverPattern/Twits/Twit.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace ObserverPattern.Twits +{ + public class Twit + { + public TwitUser Emiter { get; set; } + + public string Message { get; set; } + } +} diff --git a/src/ObserverPattern/Twits/TwitObservable.cs b/src/ObserverPattern/Twits/TwitObservable.cs index 72e787e..75a9ff2 100644 --- a/src/ObserverPattern/Twits/TwitObservable.cs +++ b/src/ObserverPattern/Twits/TwitObservable.cs @@ -8,14 +8,14 @@ namespace ObserverPattern.Twits /// /// Concrete observable /// - public class TwitObservable : IObservable + public class TwitObservable : IObservable { - List> observers; + List> observers; public TwitObservable() { - observers = new List>(); + observers = new List>(); } - public IDisposable Subscribe(IObserver observer) + public IDisposable Subscribe(IObserver observer) { if (!observers.Contains(observer)) observers.Add(observer); @@ -23,9 +23,9 @@ namespace ObserverPattern.Twits return new Unsubscriber(observers, observer); } - public void AddTwit(string twit) + public void AddTwit(Twit twit) { - foreach (var observer in observers) + foreach (var observer in observers.Where(o => o != twit.Emiter)) { observer.OnNext(twit); } @@ -41,10 +41,10 @@ namespace ObserverPattern.Twits private class Unsubscriber : IDisposable { - private List> _observers; - private IObserver _observer; + private List> _observers; + private IObserver _observer; - public Unsubscriber(List> observers, IObserver observer) + public Unsubscriber(List> observers, IObserver observer) { _observers = observers; _observer = observer; diff --git a/src/ObserverPattern/Twits/TwitUser.cs b/src/ObserverPattern/Twits/TwitUser.cs index bea6315..41a1912 100644 --- a/src/ObserverPattern/Twits/TwitUser.cs +++ b/src/ObserverPattern/Twits/TwitUser.cs @@ -8,16 +8,25 @@ namespace ObserverPattern.Twits /// /// Concrete observer /// - public class TwitUser : IObserver + public class TwitUser : IObserver, IDisposable { - string name; - public TwitUser(string name) + TwitObservable twits; + public string Name { get; private set; } + IDisposable channel; + public TwitUser(string name, TwitObservable twits) { - this.name = name; + this.Name = name; + channel = twits.Subscribe(this); + this.twits = twits; + } + + public void Twit(string twit) + { + twits.AddTwit(new Twit { Emiter = this, Message = twit }); } public void OnCompleted() { - Console.WriteLine("{0} finished watching twitter", name); + Console.WriteLine("{0} finished watching twitter", Name); } public void OnError(Exception error) @@ -25,9 +34,14 @@ namespace ObserverPattern.Twits Console.WriteLine("Error while watching twitter: {0}", error); } - public void OnNext(string value) + public void OnNext(Twit value) { - Console.WriteLine("{0} just observed that something {1} was tweeted", name, value); + Console.WriteLine("{0} just observed that {1} tweeted {2}", Name, value.Emiter.Name, value.Message); + } + + public void Dispose() + { + channel.Dispose(); } } }