[디자인 패턴 - C#] 옵저버 패턴 - 풀(pull)방식

빵욱·2024년 6월 3일

C#_디자인 패턴

목록 보기
4/4

전 포스트에 있던 옵저버 패턴 방식은 푸쉬(push) 방식이었다.

옵저버 패턴은 pull방식(옵저버가 상태 변화를 직접 조회)으로도 구현할 수 있다.

데이터가 많다면 옵저버가 필요한 데이터만 조회할 수 있도록 pull방식을 사용하는 것도 좋은 방법이라고 한다.

구현

subject

옵저버가 직접 데이터를 조회하기 때문에 접근 가능한 데이터 형태를 만들어준다.
=> 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;
    }

}

Observer

 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 메서드에서 데이터 변화를 검사한다.

Test

콘솔에서 간단하게 테스트.

 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();
 }

테스트 코드를 간단하게 해서 별로일 수 있는데
다음에 기회가되면 제대로 구현해서 포스팅 해보려고 한다..

profile
rove drink eat

0개의 댓글