Giter VIP home page Giter VIP logo

observerpatternexample's Introduction

ObserverPatternExample

Swift내에서 Observer패턴에 대한 예제

옵저버 패턴 설명은 wikipedia를 토대로 작성하였습니다.

Observer 패턴

옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.

Example

각 옵저버를 등록 및 해제할 수 있는 protocol 생성

protocol Observable {
    func addObserver(_ observer: Observer)
    func removeObserver(_ observer: Observer)
}

protocol Observer: class {
    func update(_ temp: Float, density: Float)
}

옵저버의 등록 및 해제를 실제로 담당하는 클래스 생성

class Observation: Observable {
    var observers = [Observer]()

    func addObserver(_ observer: Observer) {
        observers.append(observer)
    }

    func removeObserver(_ observer: Observer) {
        observers = observers.filter({ $0 !== observer })
    }
}

미세먼지 농도를 측정하여 알림을 보내는 클래스

class DustMeter: Observation {
    var temperature: Float = 0.0
    var density: Float = 0.0

    func notify() {
        for observer in observers {
            observer.update(temperature, density: density)
        }
    }
}

미세면지 농도 상태를 측정하는 클래스

class Subscriber: Observer {

    var name: String = ""

    func update(_ temp: Float, density: Float) {
        print("name: \(name), temp: \(temp) density: \(density)")
    }

    init(name: String) {
        self.name = name
    }
}

위의 구성을 토대로 구현한 Controller

class ViewController: UIViewController {
    let dustMeter = DustMeter()

    override func viewDidLoad() {
        super.viewDidLoad()

        // 관찰자
        let user1 = Subscriber(name: "Tom")
        let user2 = Subscriber(name: "Sam")
        let _ = Subscriber(name: "Kim")

        // 알림을 받을 유저 추가
        dustMeter.addObserver(user1)
        dustMeter.addObserver(user2)

        // 알림을 더이상 받지 않을 유저
        dustMeter.removeObserver(user1)
    }
}

extension ViewController {
    @IBAction func clickedButton() {
        dustMeter.temperature = 32
        dustMeter.density = 80


        dustMeter.notify()
    }
}

자세한 설명은 블로그 참고 https://magicmon.github.io/2017/07/04/Observer-Pattern

observerpatternexample's People

Contributors

magicmon avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Forkers

azuredark

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.