Skip to content

Instantly share code, notes, and snippets.

@luizjacomn
Created November 22, 2019 13:03
Show Gist options
  • Save luizjacomn/1b442b08c56ccc10fb106278fb723bbc to your computer and use it in GitHub Desktop.
Save luizjacomn/1b442b08c56ccc10fb106278fb723bbc to your computer and use it in GitHub Desktop.
Implementando o padrão Chain of Responsability em dart. Baseado em https://medium.com/flutterando/implementando-padr%C3%B5es-de-projetos-em-dart-parte-1-d604f6038460
void main() {
Venda venda = Venda();
CalculadoraDesconto calculadora = CalculadoraDesconto();
venda.adicionarItem(Item('Tenis', 270.0));
venda.adicionarItem(Item('Sapato', 350.0));
venda.adicionarItem(Item('Camisa', 200.0));
venda.adicionarItem(Item('Calça', 180.0));
double desconto = calculadora.calcularDesconto(venda);
print(venda.valorTotal);
print(desconto);
print(venda.valorTotal - desconto);
}
class CalculadoraDesconto {
double calcularDesconto(Venda venda) {
Desconto descontoMais3Itens = DescontoMaisDe3Itens();
Desconto descontoMais100 = DescontoValorMaisDe100();
Desconto descontoMais1000 = DescontoValorMaisDe1000();
Desconto semDesconto = SemDesconto();
descontoMais3Itens.proximo = semDesconto;
descontoMais100.proximo = descontoMais3Itens;
descontoMais1000.proximo = descontoMais100;
return descontoMais1000.calcular(venda);
}
}
abstract class Desconto {
double calcular(Venda venda);
Desconto proximo;
}
class DescontoMaisDe3Itens implements Desconto {
@override
double calcular(Venda venda) {
if (venda.itens.length >= 3) {
print('Aplicando desconto: > 3 itens');
return venda.valorTotal * 0.02;
}
return proximo.calcular(venda);
}
@override
Desconto proximo;
}
class DescontoValorMaisDe100 implements Desconto {
@override
double calcular(Venda venda) {
if (venda.valorTotal >= 100.0) {
print('Aplicando desconto: valor > 100');
return venda.valorTotal * 0.04;
}
return proximo.calcular(venda);
}
@override
Desconto proximo;
}
class DescontoValorMaisDe1000 implements Desconto {
@override
double calcular(Venda venda) {
if (venda.valorTotal >= 1000.0) {
print('Aplicando desconto: valor > 1000');
return venda.valorTotal * 0.04;
}
return proximo.calcular(venda);
}
@override
Desconto proximo;
}
class SemDesconto implements Desconto {
@override
double calcular(Venda venda) {
print('Sem desconto');
return 0.0;
}
@override
Desconto proximo;
}
// OUTROS DESCONTOS QUE PODERIA PRECISAR
class Venda {
double valorTotal;
List<Item> itens;
Venda() {
valorTotal = 0.0;
itens = List<Item>();
}
adicionarItem(Item item) {
itens.add(item);
valorTotal += item.valor;
}
}
class Item {
String nome;
double valor;
Item(this.nome, this.valor);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment