terça-feira, 26 de dezembro de 2023

Decorator Powershell Design Patterns

 Powershell Design Patterns Decorator

```powershell

# Classe base 'Beverage'

class Beverage {

    [string]$description = "Unknown Beverage"

    [string] getDescription() {

        return $this.description

    }

    [decimal] cost() {

        return 0

    }

}

# Subclasses concretas de 'Beverage'

class HouseBlend : Beverage {

    HouseBlend() {

        $this.description = "House Blend Coffee"

    }

    [decimal] cost() {

        return .89

    }

}

class DarkRoast : Beverage {

    DarkRoast() {

        $this.description = "Dark Roast Coffee"

    }

    [decimal] cost() {

        return .99

    }

}

class Espresso : Beverage {

    Espresso() {

        $this.description = "Espresso"

    }

    [decimal] cost() {

        return 1.99

    }

}

class Decaf : Beverage {

    Decaf() {

        $this.description = "Decaf Coffee"

    }

    [decimal] cost() {

        return 1.05

    }

}

class Latte : Beverage {

    Latte() {

        $this.description = "Latte Coffee"

    }

    [decimal] cost() {

        return 1.25

    }

}

# Classe decoradora 'CondimentDecorator'

class CondimentDecorator : Beverage {

    [Beverage]$beverage

    CondimentDecorator([Beverage]$beverage) {

        $this.beverage = $beverage

    }

    [string] getDescription() {

        return $this.beverage.getDescription()

    }

}

# Subclasses concretas de 'CondimentDecorator'

class Milk : CondimentDecorator {

    Milk([Beverage]$beverage) : base($beverage) {

        $this.description = "Milk"

    }

    [string] getDescription() {

        return $this.beverage.getDescription() + ", Milk"

    }

    [decimal] cost() {

        return $this.beverage.cost() + .10

    }

}

class Mocha : CondimentDecorator {

    Mocha([Beverage]$beverage) : base($beverage) {

        $this.description = "Mocha"

    }

    [string] getDescription() {

        return $this.beverage.getDescription() + ", Mocha"

    }

    [decimal] cost() {

        return $this.beverage.cost() + .20

    }

}

class Soy : CondimentDecorator {

    Soy([Beverage]$beverage) : base($beverage) {

        $this.description = "Soy"

    }

    [string] getDescription() {

        return $this.beverage.getDescription() + ", Soy"

    }

    [decimal] cost() {

        return $this.beverage.cost() + .15

    }

}

class Whip : CondimentDecorator {

    Whip([Beverage]$beverage) : base($beverage) {

        $this.description = "Whip"

    }

    [string] getDescription() {

        return $this.beverage.getDescription() + ", Whip"

    }

    [decimal] cost() {

        return $this.beverage.cost() + .10

    }

}

class Caramel : CondimentDecorator {

    Caramel([Beverage]$beverage) : base($beverage) {

        $this.description = "Caramel"

    }

    [string] getDescription() {

        return $this.beverage.getDescription() + ", Caramel"

    }

    [decimal] cost() {

        return $this.beverage.cost() + .15

    }

}

# Definições de classes como antes...

# Hashtable para mapear tipos de bebidas a suas respectivas classes

$beverageTypes = @{

    "HouseBlend" = { [HouseBlend]::new() }

    "DarkRoast" = { [DarkRoast]::new() }

    "Espresso" = { [Espresso]::new() }

    "Decaf" = { [Decaf]::new() }

}

# Hashtable para mapear tipos de condimentos a suas respectivas classes

$condimentTypes = @{

    "Milk" = { param($beverage) [Milk]::new($beverage) }

    "Mocha" = { param($beverage) [Mocha]::new($beverage) }

    "Soy" = { param($beverage) [Soy]::new($beverage) }

    "Whip" = { param($beverage) [Whip]::new($beverage) }

}

# Função para criar a bebida base usando a hashtable

function CreateBaseBeverage([string]$beverageType) {

    if ($beverageTypes.ContainsKey($beverageType)) {

        return & $beverageTypes[$beverageType]

    } else {

        throw "Invalid beverage type: $beverageType"

    }

}

# Função para adicionar condimentos usando a hashtable

function AddCondiment([Beverage]$beverage, [string]$condimentType) {

    if ($condimentTypes.ContainsKey($condimentType)) {

        return & $condimentTypes[$condimentType] $beverage

    } else {

        throw "Invalid condiment type: $condimentType"

    }

}


# Criacao de novos tipos

$beverageTypes["Latte"] = { [Latte]::new() }

$condimentTypes["Caramel"] = { param($beverage) [Caramel]::new($beverage) }


# Solicitar entrada do usuário para a bebida base

$beverageChoice = Read-Host "Please enter the type of coffee (HouseBlend, DarkRoast, Espresso, Decaf)"

$beverage = CreateBaseBeverage $beverageChoice

# Laço para adicionar condimentos

do {

    $condimentChoice = Read-Host "Add a condiment (Milk, Mocha, Soy, Whip) or 'Done' to finish"

    if ($condimentChoice -ne 'Done') {

        $beverage = AddCondiment $beverage $condimentChoice

    }

} while ($condimentChoice -ne 'Done')

# Exibir descrição e custo da bebida finalizada

Write-Host "Your final beverage: " $beverage.getDescription()

Write-Host "Total cost: $" $beverage.cost()


```

Decorator Powershell Design Patterns

 Powershell Design Patterns Decorator ```powershell # Classe base 'Beverage' class Beverage {     [string]$description = "Unkno...