250x250
반응형
05-12 08:21
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[디자인패턴] Chain of Responsibility(책임 연쇄) : 연속적인 핸들러를 통한 요청 처리 및 전달 본문

CS(컴퓨터 과학)/Design Patterns

[디자인패턴] Chain of Responsibility(책임 연쇄) : 연속적인 핸들러를 통한 요청 처리 및 전달

billnjoyce 2020. 6. 12. 18:24
728x90
반응형
디자인패턴에의 Chain of Responsibility(책임 연쇄)에 대하여 Swift를 기반으로 하여 살펴봅니다.

 

 

#. 구독 대상

  • 컴퓨터 및 소프트웨어 공학과 관련자
  • 소프트웨어 관련 종사자 
  • 기타 컴퓨터 공학에 관심이 있으신 분
  • 디자인패턴의 개념을 잡고 싶으신 분
  • 기타 소프트웨어 개발과 지식에 관심이 있으신 모든 분들
  • Swift 언어를 활용하여 디자인패턴을 공부해보고 싶으신 분들

 

 


 

Chain of Responsibility(책임 연쇄)

 

Chain of Responsibility(책임 연쇄) 패턴은 연속적인 핸들러를 통해 요청을 전달하도록 하는 행동 디자인 패턴입니다.

 

요청을 받으면 핸들러는 요청을 처리하거나 다음 핸들러로 요청을 전달합니다.

 

때로는 CoR 혹은 Chain of Command라고도 불리기도 합니다.

 

 

 

 

 


 

 

 

구조

 

Chain of Responsibility(책임 연쇄) 패턴을 UML로 도식화하면 아래와 같습니다. 

 

 

Handler : 기본이 되는 부모 추상 클래스로서 다음 핸들러 및 핸들러에 대한 정의만 구현이 되는 객체

BaseHandler : Handler 객체를 상속받아 핸들러를 가지고 있으면서 다음 핸들러와 다음 핸들러를 호출하는 구현을 가지고 있는 클래스

ConcreteHandler : BaseHandler 객체를 상속 받아서 최종 핸들에 대한 처리를 구현하는 서브 클래스 객체

 

 

 

 

 


 

 

 

 

Implementation

 

protocol Handler : class {
    @discardableResult // 결과를 사용하든 안하든 경고가 안 뜨도록 해주는 지시어
    func setNext(handler: Handler) -> Handler
    func handle(request: String) -> String?
}

class BaseHandler : Handler {
    var nextHandler: Handler?
    
    func setNext(handler: Handler) -> Handler {
        self.nextHandler = handler
        return handler
    }
    
    func handle(request: String) -> String? {
        return nextHandler?.handle(request: request)
    }
}

class MonkeyHandler : BaseHandler {
    override func handle(request: String) -> String? {
        if (request == "Banana") {
            return "Monkey : I'll eat the " + request
        } else {
            return nextHandler?.handle(request: request)
        }
    }
}

class DogHandler: BaseHandler {
    override func handle(request: String) -> String? {
        if (request == "MeatBall") {
            return "Dog : I'll eat the " + request
        } else {
            return nextHandler?.handle(request: request)
        }
    }
}

class CatHandler: BaseHandler {
    override func handle(request: String) -> String? {
        if (request == "Fish") {
            return "Cat : I'll eat the " + request
        } else {
            return nextHandler?.handle(request: request)
        }
    }
}

func handler(handler: Handler) {

     let food = ["Nut", "Banana", "Fish"]

     food.forEach({ let result = handler.handle(request: $0)
         if(result == nil) {
             print($0 + " was left untouched.")
         }
         else {
             print(result!)
        }})
}
let monkey = MonkeyHandler()
let dog = DogHandler()
let cat = CatHandler()
        
monkey.setNext(handler: dog).setNext(handler: cat)

// Chain: Monkey > Dog > Cat
handler(handler: monkey)
        
// Nut was left untouched.
// Monkey : I'll eat the Banana
// Cat : I'll eat the Fish
        
// Subchain: Dog > Cat
handler(handler: dog)
        
// Nut was left untouched.
// Banana was left untouched.
// Cat : I'll eat the Fish

 

 

 

 


 

 

 

이상으로 Swift를 기반으로하여 Chain of Responsibility(책임 연쇄) 디자인 패턴을 설명하였습니다.

 

 

 

 

감사합니다.

 

 

 

 

 

 

www.slideshare.net/BillKim8/swift-chain-of-responsibility

 

[Swift] Chain of Responsibility

Swift 소스 코드를 통한 Chain of Responsibility 디자인패턴에 관한 강의 자료입니다.

www.slideshare.net

github.com/billnjoyce/Lectures/tree/master/src/designpatterns

 

billnjoyce/Lectures

Contribute to billnjoyce/Lectures development by creating an account on GitHub.

github.com

 

 

 


[참고 자료(References)]

 

[1] Chain of Responsibility in Swift : https://refactoring.guru/design-patterns/chain-of-responsibility/swift/example

[2] Design Patterns in Swift: Chain of Responsibility Pattern : https://medium.com/design-patterns-in-swift/design-patterns-in-swift-chain-of-responsibility-pattern-f575c85a43c

[3] Design Patterns in Swift: Chain of Responsibility : https://agostini.tech/2018/05/27/design-patterns-in-swift-chain-of-responsibility/

[4] Chain of responsibility : https://riptutorial.com/swift/example/26459/chain-of-responsibility

[5] 책임 연쇄 패턴 (Chain of Responsibility Pattern in Swift) : https://jerome.kr/entry/chain-of-responsibility-pattern

[6] Design Patterns in Swift: Chain of Responsibility : https://viblo.asia/p/design-patterns-in-swift-chain-of-responsibility-WAyK8V9nlxX

[7] A Design Pattern Story in Swift – Chapter 14: Chain Of Responsibility : http://audreyli.me/2015/07/13/a-design-pattern-story-in-swift-chapter-14-chain-of-responsibility/

[8] 책임연쇄패턴 : Chain of Responsibility : https://eastroot1590.tistory.com/entry/책임연쇄패턴-Chain-of-Responsibility

[9] Design Patterns in Swift: Chain of Responsibility

 : https://codereview.stackexchange.com/questions/125723/design-patterns-in-swift-chain-of-responsibility

[10] 책임 연쇄 패턴 : https://ko.wikipedia.org/wiki/책임_연쇄_패턴

728x90
반응형
Comments