책임의 연쇄 이동 디자인 패턴 언어 (책임의 체인)

ChainOfResponsibility.go
패키지 ChainOfResponsibility

수입 (
	"FMT"
	"IO"
	"문자열"
)

{ChainLogger 인터페이스를 입력
	다음 (문자열)
}

{FirstLogger 구조체를 입력
	NextChain ChainLogger
}

다음 FUNC (문자열들) (* FirstLogger F) {
	fmt.Printf ( "첫 번째 로거 %의 \ n", S)

	f.NextChain 경우! = 전무 {
		f.NextChain.Next (들)
	}
}

{SecondLogger 구조체를 입력
	NextChain ChainLogger
}

FUNC (SE * SecondLogger) 다음에 (S 문자열) {
	경우 strings.Contains (strings.ToLower (들), "안녕하세요") {
		fmt.Printf ( "제 로거 %의 \ n", S)

		se.NextChain 경우! = 전무 {
			se.NextChain.Next (들)
		}
		반환
	}
	fmt.Printf ( "제 로깅 정삭 \ n \ n")
}

{WriterLogger 구조체를 입력
	NextChain ChainLogger
	작가 io.Writer
}

다음 FUNC (문자열들) (* WriterLogger w) {
	w.Writer 경우! = 전무 {
		w.Writer.Write ([] 바이트 ( "WriterLogger"+ S))
	}
	w.NextChain 경우! = 전무 {
		w.NextChain.Next (들)
	}
}

  

ChainOfResponsibility_test.go
패키지 ChainOfResponsibility

수입 (
	"FMT"
	"문자열"
	"테스트"
)

{myTestWriter 구조체를 입력
	receivedMessage * 문자열
}

FUNC (m * myTestWriter) 쓰기 (p [] 바이트) (INT 에러) {
	경우 m.receivedMessage == 전무 {
		m.receivedMessage = 새 (문자열)
	}
	tempMessage = fmt.Sprintf ( "% P % S"m.receivedMessage, P)
	m.receivedMessage = tempMessage
	창 LEN (p), 전무
}

FUNC (m * myTestWriter) 다음에 (S 문자열) {
	m.Write ([] 바이트 (들))
}

FUNC TestCreateDefaultChain (t * testing.T) {
	myWriter = myTestWriter {}

	writerLogger = WriterLogger {작가 : & myWriter}
	초 = {SecondLogger NextChain & writerLogger}
	체인 = {FirstLogger NextChain & 초}

	t.Run는 (+ "를 3 로거, 그 중 2가 세운 두 번째 경우에만, 콘솔에 기록"
		"세상 '안녕하세요', 일부 변수의 경우 두 번째 FOUND '안녕하세요'에 세 번째 쓰기",
		FUNC (t * testing.T) {
			chain.Next ( "메시지 휴식 체인 \ n 그")

			myWriter.receivedMessage 경우! = 전무 {
				t.Error ( "마지막 링크는 모든 메시지를받지해야한다")
			}

			chain.Next ( "안녕하세요 \ n")
			* myWriter.receivedMessage == ""만약 ||
				! strings.Contains (* myWriter.receivedMessage, "안녕하세요") {
				t.Fatal ( "마지막 링크는 예상 메시지를 수신하지 않았다")
			}
		})
}

  



추천

출처www.cnblogs.com/aguncn/p/11900872.html