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()
```