Files
design_pattens/behavioral/observer/ObserverSample.cs
T
2021-04-28 00:23:41 +03:00

105 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace design_patterns.behavioral.observer
{
/// <summary>
/// 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 theyre 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.
/// </summary>
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<ISubscriber> subscribers = new List<ISubscriber>();
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}");
}
}
}
}