전 포스트에 있던 옵저버 패턴 방식은 푸쉬(push) 방식이었다.
옵저버 패턴은 pull방식(옵저버가 상태 변화를 직접 조회)으로도 구현할 수 있다.
데이터가 많다면 옵저버가 필요한 데이터만 조회할 수 있도록 pull방식을 사용하는 것도 좋은 방법이라고 한다.
옵저버가 직접 데이터를 조회하기 때문에 접근 가능한 데이터 형태를 만들어준다.
=> ProductAvailability
// 풀 방식.
public class Product3
{
private string _productName;
private string _productAvailability;
public Product3(string productName)
{
_productName = productName;
_productAvailability = "Out of Stock";
}
public string ProductAvailability
{
get => _productAvailability;
set => _productAvailability = value;
}
}
public class User3
{
private string _userName;
private string _lastAvailabilityStatus;
private Product3 _product;
public User3(string userName, Product3 product)
{
_userName = userName;
_product = product;
_lastAvailabilityStatus = product.ProductAvailability;
}
public void CheckAvailability()
{
if(_product.ProductAvailability != _lastAvailabilityStatus)
{
_lastAvailabilityStatus = _product.ProductAvailability;
Console.WriteLine($"안녕하세요, {_userName}님! 제품의 가용성이 변경되었습니다: {_lastAvailabilityStatus}");
}
}
}
CheckAvailability 메서드에서 데이터 변화를 검사한다.
콘솔에서 간단하게 테스트.
private static Product3 AirPods;
private static User3 customer1 ;
private static User3 customer2 ;
static void Main(string[] args)
{
AirPods = new Product3("AirPods");
customer1 = new User3("Kane", AirPods);
customer2 = new User3("Sady", AirPods);
Timer timer = new Timer(CheckProductAvailability, null, 0, 1000);
Console.WriteLine("처음 제품 상태: " + AirPods.ProductAvailability);
Thread.Sleep(3000); // 3초대기
AirPods.ProductAvailability = "In Stock";
Thread.Sleep(5000); // 5초대기
timer.Dispose();
}
private static void CheckProductAvailability(object state)
{
// 상태확인
customer1.CheckAvailability();
customer2.CheckAvailability();
}
테스트 코드를 간단하게 해서 별로일 수 있는데
다음에 기회가되면 제대로 구현해서 포스팅 해보려고 한다..