본문 바로가기

GO lang

[GO] Decorator 패턴

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