Update Observer pattern

This commit is contained in:
Petrutiu Mihai
2016-06-23 22:06:34 +03:00
parent c66816b938
commit 3ecd8e332b
5 changed files with 53 additions and 32 deletions

View File

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

View File

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

View File

@@ -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; }
}
}

View File

@@ -8,14 +8,14 @@ namespace ObserverPattern.Twits
/// <summary>
/// Concrete observable
/// </summary>
public class TwitObservable : IObservable<string>
public class TwitObservable : IObservable<Twit>
{
List<IObserver<string>> observers;
List<IObserver<Twit>> observers;
public TwitObservable()
{
observers = new List<IObserver<string>>();
observers = new List<IObserver<Twit>>();
}
public IDisposable Subscribe(IObserver<string> observer)
public IDisposable Subscribe(IObserver<Twit> 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<IObserver<string>> _observers;
private IObserver<string> _observer;
private List<IObserver<Twit>> _observers;
private IObserver<Twit> _observer;
public Unsubscriber(List<IObserver<string>> observers, IObserver<string> observer)
public Unsubscriber(List<IObserver<Twit>> observers, IObserver<Twit> observer)
{
_observers = observers;
_observer = observer;

View File

@@ -8,16 +8,25 @@ namespace ObserverPattern.Twits
/// <summary>
/// Concrete observer
/// </summary>
public class TwitUser : IObserver<string>
public class TwitUser : IObserver<Twit>, 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();
}
}
}