Dúvida com design patterns

package padraostrategy;
public class ContaEstacionamento {
	private Veiculo veiculo;
	long horas;    	
	public ContaEstacionamento(Veiculo veiculo, long horas) {
		super();
		this.veiculo = veiculo;
		this.horas = horas;
	}
	public double calcularConta(){
		return this.veiculo.obterValor(horas);    		
	}
}

package padraostrategy;
public abstract class Veiculo {
	public abstract double obterValor(long horas);
			
}

package padraostrategy;

public class Onibus extends Veiculo{
	@Override
	public double obterValor(long horas) {    	
		
		return horas * 9.50;
	}

}

public class Caminhao extends Veiculo {

	@Override
	public double obterValor(long horas) {   		
		
		return horas * 4.50;
	}

}

Boa noite Pessoal, estou aplicar o padrão strategy nesse código , tenho dúvida se é realmente assim que se aplica o padrão. estou pegando de um exemplo do livro “Design Patters com Java” da casa dos códigos.

O que você fez nada mais é do que sobrescrita de métodos.
Se fosse Strategy, você teria uma interface para o algoritmo do cálculo.
Você iria definir um atributo do tipo dessa interface na classe Veículo e faria com que Caminhao instanciasse uma implementação da interface e o Onibus instanciasse outra implementação.

2 curtidas

ok entendi! Irei tentar fazer aqui. Obrigado!

Apenas complementando a resposta do @staroski:

O Strategy serve para casos onde várias classes só diferem em um determinado comportamento, algo específico. No seu exemplo, as subclasses de Veiculo diferem apenas na maneira como o valor é calculado. Ao invés de herdar de Veiculo, você cria um novo tipo abstrato referente à regra de cálculo de preço e usa uma referência desse tipo para calcular o preço.

interface RegraDeCalculo {
	double calcularValor(long horas);
}

class Veiculo {
	RegraDeCalculo regra;
	
	double obterValor(long horas) {
		return regra.calcularValor(horas);
	}
}

class DoisEixosLeve implements RegraDeCalculo {
	@Override
	public double calcularValor(long horas) {
		return 4.5 * horas;
	}
}

class ContaEstacionamento {
	Veiculo veiculo;
	long horas;
	
	double calcularConta() {
		return veiculo.obterValor(horas);
	}
}

Esse exemplo é muito simplificado, usar Strategy aqui é um overkill gigantesco. A classe Veiculo é completamente desnecessária, a regra de cálculo poderia ser utilizada diretamente por ContaEstacionamento.

3 curtidas

Exatamente @lvbarbosa!
Fico chateado quando professores criam cenários muito simples para tentar ensinar Design Patterns.
Não faz sentido pois os padrões são justamente para ajudar a simplificar cenários complexos.
O que acaba acontecendo é que, ao aplicar Design Patterns em cenários simples, acabam tornando a solução complexa.
A consequência disso é que desperta no estudante a sensação de que não vale a pena utilizar Design Patterns, o que é lamentável.

4 curtidas

eu vi o padrão no livro e criei um cenário mais simples possível para entender e depois ir evoluindo o mesmo

Ah legal, entendi, realmente é uma forma bacana para aprender muitas coisas.
Mas percebeu o que aconteceu neste caso?
Te deixou com dúvidas.

Já vi isso acontecer muitas vezes com vários colegas.
Acredito que acontece justamente porque os padrões não foram elaborados para resolver problemas triviais.
Se você tenta aplicar Design Patterns em cenários triviais, acaba injetando complexidade desnecessária no código.

2 curtidas

Exatamente , tentei resolver um problema simples de forma complexa.