From 6b6a491a990adb94fff5611187b41bd823bff137 Mon Sep 17 00:00:00 2001 From: Claudiu Farcas Date: Wed, 28 Apr 2021 00:23:41 +0300 Subject: [PATCH] observer design pattern --- Program.cs | 4 +- behavioral/observer/ObserverSample.cs | 105 ++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 behavioral/observer/ObserverSample.cs diff --git a/Program.cs b/Program.cs index b01637c..b54d3bb 100644 --- a/Program.cs +++ b/Program.cs @@ -19,6 +19,7 @@ using design_patterns.behavioral.command; using design_patterns.behavioral.iterator; using design_patterns.behavioral.mediator; using design_patterns.behavioral.memento; +using design_patterns.behavioral.observer; namespace design_patterns { @@ -51,7 +52,8 @@ namespace design_patterns // await CommandSample.Run(); // await IteratorSample.Run(); // await MediatorSample.Run(); - await MementoSample.Run(); + // await MementoSample.Run(); + await ObserverSample.Run(); } catch (System.Exception ex) { diff --git a/behavioral/observer/ObserverSample.cs b/behavioral/observer/ObserverSample.cs new file mode 100644 index 0000000..80e73e5 --- /dev/null +++ b/behavioral/observer/ObserverSample.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace design_patterns.behavioral.observer +{ + /// + /// Observer is a behavioral design pattern that lets you + /// define a subscription mechanism to notify multiple objects + /// about any events that happen to the object they’re observing. + /// + /// Use it when: + /// - changes to the state of one object may require changing other objects, + /// and the actual set of objects is unknown beforehand + /// or changes dynamically. + /// - some objects in your app must observe others, + /// but only for a limited time or in specific cases. + /// + public class ObserverSample + { + public static async Task Run() + { + Console.WriteLine("Behavioral - Observer"); + + StockMarket stockMarket = new(); + stockMarket.StockPrice += 1; + Buyer buyer1 = new("John"); + stockMarket.Subscribe(buyer1); + stockMarket.StockPrice += 1; + Buyer buyer2 = new("Vanessa"); + stockMarket.Subscribe(buyer2); + stockMarket.StockPrice += 1; + stockMarket.StockPrice += 1; + stockMarket.Unsubscribe(buyer1); + stockMarket.StockPrice += 1; + } + + // publisher interface + public interface IPublisher + { + void Subscribe(ISubscriber subscriber); + void Unsubscribe(ISubscriber subscriber); + void Notify(); + + // extra + int StockPrice { get; set; } + } + + // subscriber (observer) interface + public interface ISubscriber + { + void Update(IPublisher publisher); + } + + public class StockMarket : IPublisher + { + + private int _stockPrice = 100; + public int StockPrice + { + get => _stockPrice; + set + { + if (_stockPrice == value) + return; + _stockPrice = value; + Notify(); + } + } + + private List subscribers = new List(); + public void Notify() + { + System.Console.WriteLine($"Publisher is pushing new price {StockPrice}."); + foreach (var subscriber in subscribers) + subscriber.Update(this); + } + + public void Subscribe(ISubscriber subscriber) + { + subscribers.Add(subscriber); + } + + public void Unsubscribe(ISubscriber subscriber) + { + subscribers.Remove(subscriber); + } + } + + public class Buyer : ISubscriber + { + public Buyer(string name) + { + this.Name = name; + + } + public string Name { get; set; } + public void Update(IPublisher publisher) + { + System.Console.WriteLine($"Buyer {Name} got updated with price {publisher.StockPrice}"); + } + } + + } +} \ No newline at end of file