mirror of
https://github.com/farcasclaudiu/design_pattens.git
synced 2026-06-22 07:01:29 +03:00
observer design pattern
This commit is contained in:
+3
-1
@@ -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)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
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 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.
|
||||
/// </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}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user