golang - 핸들러 패턴

type SpecialFunc func(int) bool

SpecialFunc은 int를 받고 bool을 반환하는 함수를 뜻하는 타입이 된다.
이것에 대해서 메소드를 생성하는 것이 가능핟.

func (sf SpecialFunc) SpecialMethod() {
    ...
}

일회용 구조체에 의한 핸들러 패턴

핸들링 처리를 함수로서 넘기고, 이것을 내포한 핸들러를 반환하는 구현을 생각한다. 아마 아래와 같은 구현이 될 것이다.
예:로그 핸들러. Record는 기록하는 로그를 나타내는 가공의 타입이다)

type LogHandler interface {
    Log(r *Record) error
}

type handlerFunc func(*Record) error

type FuncLogHandler struct {
    fn handlerFunc
}

func (fh *FuncLogHandler) Log(r *Record) error {
    return fh.fn(r)
}

func NewFuncLogHandler(f func(*Record) error) Handler {
    return &FuncLogHandler{fn: handlerFunc(f)}
}

넘겨진 함수를 Log 메소드로 사용하기 위해서 일회용 구조체를 정의한다.
함수의 메소드를 이용하면 간단하게 쓸 수 있다.

함수의 메소드를 사용한 핸들러 패턴

type LogHandler interface {
    Log(r *Record) error
}

type handlerFunc func(*Record) error

func FuncLogHandler(fn func(r *Record) error) Handler {
    return handlerFunc(fn)
}

func (hf HandlerFunc) Log(r *Record) error {
    return hf(r)
}

일회용 구조체를 사용하지 않고 간단하게 쓸 수 있었다.


이 글은 2018-12-28에 작성되었습니다.