Facade Pattern

Without Facade

const paymentProc = new PaymentProcessor();
const inventorySystem = new InventorySystem();
const shippingService = new ShippingService();
const fraudDetection = new FraudDetection();

if (fraudChecker.verify(user)){
    if (inventorySystem.checkStock(item)){
        paymentProc.processPayment(user, item);
        inventorySystem.updateStock(item);
        shippingService.shipItem(user, item);
    } else {
        console.log("Item out of stock");
    }
}

Without Facade in Go

package main
import "fmt"
type PaymentProcessor struct{}
func (p *PaymentProcessor) ProcessPayment(user User, item Item) {
    fmt.Println("Processing payment for", user.Name, "for item", item.Name)
}
type InventorySystem struct{}
func (i *InventorySystem) CheckStock(item Item) bool {
    fmt.Println("Checking stock for item", item.Name)
    return true // Assume item is in stock
}
func (i *InventorySystem) UpdateStock(item Item) {
    fmt.Println("Updating stock for item", item.Name)
}
type ShippingService struct{}
func (s *ShippingService) ShipItem(user User, item Item) {
    fmt.Println("Shipping item", item.Name, "to", user.Address)
}
type FraudDetection struct{}
func (f *FraudDetection) Verify(user User) bool {
    fmt.Println("Verifying user", user.Name)
    return true // Assume user is verified
}
type User struct {
    Name    string
    Address string
}
type Item struct {
    Name string
}
func main() {
    user := User{Name: "Alice", Address: "123 Main St"}
    item := Item{Name: "Laptop"}
    paymentProc := &PaymentProcessor{}
    inventorySystem := &InventorySystem{}
    shippingService := &ShippingService{}
    fraudDetection := &FraudDetection{}
    if fraudDetection.Verify(user) {
        if inventorySystem.CheckStock(item) {
            paymentProc.ProcessPayment(user, item)
            inventorySystem.UpdateStock(item)
            shippingService.ShipItem(user, item)
        } else {
            fmt.Println("Item out of stock")
        }
    }
}

With Facade

const orderSystem = new OrderFacade();
orderSystem.placeOrder(user, item);

With Facade in Go

package main
import "fmt"
type OrderFacade struct {
    paymentProcessor PaymentProcessor
    inventorySystem  InventorySystem
    shippingService  ShippingService
    fraudDetection   FraudDetection
}
func NewOrderFacade() *OrderFacade {
    return &OrderFacade{
        paymentProcessor: NewPaymentProcessor(),
        inventorySystem:  NewInventorySystem(),
        shippingService:  NewShippingService(),
        fraudDetection:   NewFraudDetection(),
    }
}
}
func (f *OrderFacade) PlaceOrder(user User, item Item) {
    if f.fraudDetection.Verify(user) {
        if f.inventorySystem.CheckStock(item) {
            f.paymentProcessor.ProcessPayment(user, item)
            f.inventorySystem.UpdateStock(item)
            f.shippingService.ShipItem(user, item)
        } else {
            fmt.Println("Item out of stock")
        }
    }
}