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();
}
}
}