最終更新:2020/05/04
この記事の内容は
を参考にして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