読者です 読者をやめる 読者になる 読者になる

Go言語入門 / golang 入門 デザインパターン Decorator

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0

こんにちはnasustです。WikipediaDecorator パターン - Wikipediaを参考にGo言語 / golangで実装してみました。

wikipadiaの例と違うところはabstclassを構造体の埋め込みで対応しています。

package main

import "fmt"

type Price interface {
    GetValue() int
}

type PrimePrice struct {
    value int
}

func NewPrimePrice(value int) *PrimePrice {
    return &PrimePrice{value}
}

func (self *PrimePrice) GetValue() int {
    return self.value
}

type MarginPrice struct {
    originalPrice Price
}

type WholesalePrice struct {
    MarginPrice
    advantage int
}

func NewWholesalePrice(price Price, advantage int) *WholesalePrice {
    return &WholesalePrice{MarginPrice{price}, advantage}
}

func (self *WholesalePrice) GetValue() int {
    return self.originalPrice.GetValue() + self.advantage
}

type DoublePrice struct {
    MarginPrice
}

func NewDoublePrice(price Price) *DoublePrice {
    return &DoublePrice{MarginPrice{price}}
}

func (self *DoublePrice) GetValue() int {
    return self.originalPrice.GetValue() * 2
}

func main() {
    price := NewWholesalePrice(NewDoublePrice(NewWholesalePrice(NewDoublePrice(NewPrimePrice(120)), 80)), 200)

    fmt.Println("Price: ", price.GetValue())
}

Go言語 / golang 入門 目次に戻る

広告を非表示にする