Хотя этот вопрос относится к https://codereview.stackexchange.com/, но я постараюсь написать краткий ответ.
Определение шаблона Observer из DoFactory (GOF),
Шаблон Observer определяет зависимость один-ко-многим между объектами, поэтому при изменении состояния одного объекта все его зависимостиуведомляется и обновляется автоматически.
В вашем примере вы не определили ни одного наблюдателя, вместо этого у вас есть события, которые изменяют состояние самого объекта.И в методе Add () слишком много ответственности или работы.
Примером Обозревателя может служить корзина покупок (электронная коммерция), например, при изменении количества товаров объект сводки заказов должен знать об этом и пересчитывать сводку (налоги, скидки, итого и т. Д.)..).Ниже приведен пример, в котором Сводка корзины и заказа обновляется как наблюдатель за элементами корзины.Он не идеален, но даст вам представление о шаблоне Observer:
class Product
{
// Product properties
}
class ProductCollection
{
private List<Observer> _observers = new List<Observer>();
List<Product> _internalcol = new List<Product>();
public void Attach(Observer observer)
{
_observers.Add(observer);
}
public void Detach(Observer observer)
{
_observers.Remove(observer);
}
public void Add(Product p)
{
_internalcol.Add(p)
Notify();
}
public void Remove(Product p)
{
}
private void Notify()
{
foreach (Observer o in _observers)
{
o.Update();
}
}
}
class Cart
{
public ProductionCollection products = new ProductionCollection();
public OrderSummary summary = new OrderSummary();
public Cart()
{
products.Attach(new OrderSummary(products));
}
public void AddProduct(Product p, int count)
{
if(count > 1){
foreach(int i in count){
products.Add(p);
}
else if(count == 1){
products.Add(p);
}
else if(count == 0)
{
products.Remove(p);
}
}
}
abstract class Observer()
{
abstract void Update();
}
class OrderSummary: Observer
{
ProductionCollection _products;
// Constructor
public OrderSummary(ProductionCollection products)
{
this._products = products;
}
public override void Update()
{
//Recalculate taxes, discount etc. here.
// Update Summary object
}
public void GetSummary()
{
// return/print Summary object;
}
}
class program
{
static void Main(string[] args)
{
Cart c = new Cart();
c.products.AddProduct(
new Product()
{
Id = 50,
Name = "Watermelon",
Price = 9.21
});
}
}
Возможно, он не скомпилируется. Я написал его в Блокноте.