[디자인 패턴 - C#] 옵저버 패턴 - Event사용.

빵욱·2024년 6월 3일

C#_디자인 패턴

목록 보기
3/4

Event를 사용하면 전 포스트 처럼 List를 사용하지 않고 옵저버 패턴을 구현할 수 있다.

Subject

기존 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 인터페이스를 사용안해도 된다.

Observer

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 메서드를 등록한다.

Test

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

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";
profile
rove drink eat

0개의 댓글