Event를 사용하면 전 포스트 처럼 List를 사용하지 않고 옵저버 패턴을 구현할 수 있다.
기존 Product 코드를
public class Product2
{
public event EventHandler<string> ProductAvailabilityChanged;
private string _productName;
private string _productAvailability;
public Product2(string productName)
{
_productName = productName;
_productAvailability = "Out of Stock";
}
public string ProductAvailability
{
get => _productAvailability;
set
{
if (_productAvailability != value)
{
_productAvailability = value;
OnProductAvailabilityChanged(value);
}
}
}
protected virtual void OnProductAvailabilityChanged(string availability)
{
ProductAvailabilityChanged?.Invoke(this, availability);
}
}
간단하게 Product2로 만들어서 Event를 추가했다.
이벤트를 사용하면 ISubject 인터페이스를 사용안해도 된다.
public class User2
{
private string _userName;
public User2(string userName, Product2 product)
{
_userName = userName;
product.ProductAvailabilityChanged += Update;
}
private void Update(object sender, string availability)
{
Console.WriteLine($"안녕하세요, {_userName}님! 제품의 가용성이 변경되었습니다: {availability}");
}
}
생성자에서 Product2 객체의 이벤트에 Update 메서드를 등록한다.
콘솔에서 간단하게 테스트.
Console.WriteLine("/////////////////////////////////////////\n");
Product2 product2 = new Product2("게임 콘솔");
User2 user3 = new User2("Kane", product2);
User2 user4 = new User2("Sady`", product2);
Console.WriteLine("처음 제품 상태: " + product2.ProductAvailability);
product2.ProductAvailability = "In Stock";
product2.ProductAvailability = "close to being sold out";