Proxyパターン

最終更新:2020/05/04


この記事の内容は

java言語で学ぶデザインパターン

を参考にしてGo言語に置き換えた内容になってます。

わかりにくい箇所は私の責任であり、java言語で学ぶデザインパターンのせいではありません。

1. Proxyパターンとは

Proxyパターンは、要求を代理人オブジェクトが受け取って処理するパターンです。

代理人ができないことは本人が処理をするという考え方です。

Adapterパターンに似ていますが、Adapterと異なって同じインターフェースを使います

実装

package proxy import ( "fmt" "time" ) // Subject type Printable interface { Print(name string) SetPrinterName(name string) GetPrinterName() string } // RealSubject type Printer struct { Name string } func NewPrinter(name string) *Printer { printer := &Printer{ Name: name, } printer.heavyJob("Printerのインスタンスを生成中...") return printer } func (p *Printer) Print(name string) { fmt.Println("=== " + p.Name + " ===") fmt.Println(name) } func (p *Printer) SetPrinterName(name string) { p.Name = name } func (p *Printer) GetPrinterName() string { return p.Name } func (p *Printer) heavyJob(name string) { fmt.Print(name) for i := 0; i < 5; i++ { time.Sleep(time.Second * 1) } fmt.Println("完了") } // proxy type PrinterProxy struct { Name string real *Printer } func NewPrinterProxy(name string) *PrinterProxy { proxy := &PrinterProxy{ Name: name, } //printer.heavyJob("Printerのインスタンスを生成中") return proxy } func (p *PrinterProxy) GetPrinterName() string { return p.Name } func (p *PrinterProxy) SetPrinterName(name string) { p.Name = name } func (p *PrinterProxy) Print(name string) { // 本人を生成 if p.real == nil { p.real = NewPrinter(p.Name) } p.real.Print(name) }

説明

このコードをmain関数で呼び出します。

package main import "github.com/java-lang-programming/marsa/proxy" func main() { proxy := proxy.NewPrinterProxy("Alice") fmt.Println("私は" + proxy.GetPrinterName() + "です。") proxy.SetPrinterName("Bob") fmt.Println("私は" + proxy.GetPrinterName() + "です。") proxy.Print("Hello world") }

実行すると以下が出力されます。

# go run main.go 私はAliceです。 私はBobです。 Printerのインスタンスを生成中...完了 === Bob === Hello world