[행동패턴] Observer Pattern

suojae·2023년 11월 20일
0

[iOS] 디자인패턴

목록 보기
1/10

https://www.youtube.com/watch?v=1dwx3REUo34
아래 내용은 위영상을 참고해서 작성했습니다


Observer pattern 개념

  • 옵저버 패턴은 말그대로 감시자들이 한 곳을 계속해서 바라보고 있는 패턴입니다.
  • 즉 감시자들이 이벤트 변화시 바로 반응할 수 있는 패턴이라고 볼 수 있습니다.
  • ObserverSubscriber, Listener 등의 이름으로 불리기도 합니다
  • 옵저버와 대조되는 용어인 Polling 은 이벤트 변화를 감지하기 위해서는 일정시간마다 업데이트를 해주어야합니다.



Observer pattern 클래스 구조

  • 먼저 이벤트를 감시할 Observer 인터페이스 클래스를 만듭니다.
  • Observer 인터페이스는 update() 메서드를 가지고 있습니다.
  • 이제 Observer를 상속받아 실제 옵저버 클래스를 만듭니다. 이 때 옵저버들은 각각 update() 함수를 가지고 있습니다.
  • 이벤트 안에는 자기 자신을 바라보고 있는 옵저버들을 소유하고 있습니다. 즉 이벤트 안에 리스트로 옵저버들이 보관되어 있습니다.
  • 이벤트 안의 함수로는 addObserver() 와 소유하고 있는 observer의 update() 함수를 호출하는 notify() 함수가 있습니다.



Observer Pattern 코드로 구현하기

   +-------------+
   |   Observer  |
   |  (protocol) |
   +------+------+
          ^
          |
+---------+---------+
|                   |
|                   |
+---------+         +---------+
|   Cat   |         |   Dog   |
+---------+         +---------+
      ^                   ^
      |                   |
      +---------+---------+
                |
          +-----+-----+
          |   Owner   |
          +-----------+

// Define the Observer protocol
protocol Observer {
    func update()
}

// Define Cat class conforming to Observer
class Cat: Observer {
    func update() {
        print("meow")
    }
}

// Define Dog class conforming to Observer
class Dog: Observer {
    func update() {
        print("bark")
    }
}

// Define the Owner class
class Owner {
    private var animals = [Observer]()

    // Register an animal observer
    func register(animal: Observer) {
        animals.append(animal)
    }

    // Notify all registered observers
    func notify() {
        for animal in animals {
            animal.update()
        }
    }
}

// Example usage
let owner = Owner()
let cat = Cat()
let dog = Dog()

owner.register(animal: cat)
owner.register(animal: dog)

owner.notify()

//meow
//bark
profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글