1
0
Fork 0
mirror of https://github.com/tmrts/go-patterns.git synced 2025-04-10 20:41:04 +00:00
go-patterns/structural/facade.md
2017-09-01 17:52:07 +04:00

1.9 KiB

Facade Pattern

Facade design pattern provides a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use

Implementation

package facade

// Models
type Product struct {
    name string
    cost float64
    discount float64
}

type User struct {
    name string
    discount float64
}

// Storages
type ProductStorage struct {
    storageMap map[string]Product
}

func (storage ProductStorage) GetProductByName(name string) Product{
    product, ok := storage.storageMap[name]
    if (!ok){
        panic("Product is absent")
    }

    return product
}

type UserStorage struct {
    storageMap map[string]User
}

func (storage UserStorage) GetUserByName(name string) User{
    user, ok := storage.storageMap[name]
    if (!ok){
        panic("User is absent")
    }

    return user
}

// Facade
type ProductFacade struct {
    productStorage ProductStorage
    userStorage UserStorage
}

func (productFacade ProductFacade) GetDiscountedCost(userName string, productName string) float64 {
    product := productFacade.productStorage.GetProductByName(productName)
    user := productFacade.userStorage.GetUserByName(userName)

    return product.cost * (1 - product.discount) * (1 - user.discount)
}

Usage

    user := User{name: "Alex", discount: 0.2}
    product := Product{name: "Car", cost:10.50, discount: 0.1 }

    userStorage := UserStorage{storageMap: make(map[string]User)}
    userStorage.storageMap[user.name] = user

    productStorage := ProductStorage{storageMap: make(map[string]Product)}
    productStorage.storageMap[product.name] = product

    facade := ProductFacade{productStorage: productStorage, userStorage: userStorage}
    discount := facade.GetDiscountedCost("Alex", "Car")
    fmt.Printf("Cost with discount is: %f", discount)