[swift] Deligate Pattern

GOSARI·2021년 11월 12일
0

swift

목록 보기
9/11

케이스 1

// MARK: -Delegation 없이 두 객체가 서로를 보는 경우

class Writer {
    var writtenScriptPage: Int
    var manager: Manager?
    var gameID: String
    var hasFinalScript: Bool

    init(writtenScriptPage: Int, manager: Manager, gameID: String, var hasFinalScript: Bool = false) {
        self.writtenScriptPage = writtenScriptPage
        self.manager = manager
        self.gameID = gameID
        self.hasFinalScript = hasFinalScript

        self.manager?.writer = self
    }

    func write(for hours: Int) {
        self.writtenScriptPage += hours
    }

    func proofread() {
        hasFinalScript = true
    }
}

class Manager {
    var writer: Writer?

    init() {
        self.writer?.manager = self
    }

    func upload() {
        writer?.proofread()

        let finalScript = writer?.hasFinalScript
        if finalScript != nil {
            print("최종본이 업로드되었습니다.")
        } else {
            print("작가가 기한 내 원고를 제출하지 못했습니다.")
        }
    }
}

let manager = Manager()
let writer = Writer(writtenScriptPage: 350, manager: manager, gameID: "gosari9876")

manager.upload()

케이스 2

// MARK: - Delegation을 이용하는 경우

protocol Writable {
    var manager: Manageable? { get set }
    var hasFinalScript: Bool { get }
    
    func proofread()
}

protocol Manageable {
    var writer: Writable? { get set }
}

class Writer: Writable {
    var writtenScriptPage: Int
    var manager: Manageable?
    var gameID: String
    var hasFinalScript: Bool
    
    init(writtenScriptPage: Int, manager: Manageable?, gameID: String, var hasFinalScript: Bool = false) {
        self.writtenScriptPage = writtenScriptPage
        self.manager = manager
        self.gameID = gameID
        self.hasFinalScript = hasFinalScript
        
        self.manager?.writer = self
    }
    
    func write(for hours: Int) {
        self.writtenScriptPage += hours
    }
    
    func proofread() {
        hasFinalScript = true
    }
}

class Manager: Manageable {
    var writer: Writable?
    
    init() {
        self.writer?.manager = self
    }
    
    func upload() {
        writer?.proofread()
        
        let finalScript = writer?.hasFinalScript
        if finalScript != nil {
            print("최종본이 업로드되었습니다.")
        } else {
            print("작가가 기한 내 원고를 제출하지 못했습니다.")
        }
    }
}

let manager = Manager()
let writer = Writer(writtenScriptPage: 350, manager: manager, gameID: "gosari9876")

manager.upload()

케이스 1의 경우:

  • 참조 순환이 발생한다.
  • 각 객체의 책임과 무관하게 다른 객체의 정보에 접근할 수 있다.

케이스 2의 경우:

  • 케이스 1의 문제가 보완된다.
  • SOLID의 개방-폐쇄 원칙을 따른다.

이전에 작성한 내용

봐도 봐도 이해가 안 되니까 보던 링크라도 정리해보자...

0개의 댓글