decorator 패턴을 이용한 샘플코드, 함수를 추가 제거가 쉽다. 유지보수가 편하다.
main.go
1. 암호화 > 압축 > 압축해제 > 복호화
2. 압축 > 압축해제
구현 부분에서 간단한 코드 변경만으로 암호화/복호화 부분을 추가하거나 제거하기가 쉬워진다.
package main
import (
"github.com/tuckersGo/goWeb/web9/lzw"
"github.com/tuckersGo/goWeb/web9/cipher"
"fmt"
)
var sentData string
var recvData string
type Component interface {
Operator(string)
}
type SendComponent struct{}
func (self *SendComponent) Operator(data string) {
// Send data
sentData = data
}
type ZipComponent struct {
com Component
}
func (self *ZipComponent) Operator(data string) {
zipData, err := lzw.Write([]byte(data))
if err != nil {
panic(err)
}
self.com.Operator(string(zipData))
}
type EncryptComponent struct {
key string
com Component
}
func (self *EncryptComponent) Operator(data string) {
encryptData, err := cipher.Encrypt([]byte(data), self.key)
if err != nil {
panic(err)
}
self.com.Operator(string(encryptData))
}
type DecryptComponent struct {
key string
com Component
}
func (self *DecryptComponent) Operator(data string) {
decryptData, err := cipher.Decrypt([]byte(data), self.key)
if err != nil {
panic(err)
}
self.com.Operator(string(decryptData))
}
type UnzipComponent struct {
com Component
}
func (self *UnzipComponent) Operator(data string) {
unzipData, err := lzw.Read([]byte(data))
if err != nil {
panic(err)
}
self.com.Operator(string(unzipData))
}
type ReadComponent struct{}
func (self *ReadComponent) Operator(data string) {
recvData = data
}
func main() {
/*
Enc > Zip > Unzip > Dec
암호화하고 압축 처리
*/
sender := &EncryptComponent{
key: "abcde",
com: &ZipComponent{
com: &SendComponent{},
},
}
sender.Operator("Hello World")
fmt.Println(sentData)
receiver := &UnzipComponent{
com: &DecryptComponent{
key: "abcde",
com: &ReadComponent{},
},
}
receiver.Operator(sentData)
fmt.Println(recvData)
/*
Zip > Unzip
압축만해서 처리
*/
// sender := &ZipComponent{
// com: &SendComponent{},
// }
// sender.Operator("Hello World")
// fmt.Println(sentData)
// receiver := &UnzipComponent{
// com: &ReadComponent{},
// }
// receiver.Operator(sentData)
// fmt.Println(recvData)
}
참고 [https://www.youtube.com/watch?v=YfrAlQKWRGg&list=PLy-g2fnSzUTDALoERcKDniql16SAaQYHF&index=10]
'GO lang' 카테고리의 다른 글
[GO] Decorator - 심화(log pattern) (0) | 2021.11.12 |
---|---|
[GO] Scrapping(2) - Echo server (0) | 2021.10.15 |
[GO] Scrapping(1) - URL checker (0) | 2021.10.07 |
[GO] channel (0) | 2021.10.07 |
[GO] 고루틴 (0) | 2021.10.07 |