Ir para o conteúdo
op_h2tuga

Aplicar pattern visitor

Mensagens Recomendadas

op_h2tuga

Boas,

Estou com um trabalho e tenho uma duvida acerca da implementação de esta pattern, eu necessito acrecentar novos tipos de carros á class carro exemplo(quero adicionar o 4X4) mas sem alterar esta classe, mas segundo o que li e entendi da estrutura de esta pattern, a interface que implemento na class carro é a CarroVisitavel implentando o método

void accept(Carro c)

e na class visitante irei implementar a interface CarroVisitante e implementando o método 

void visitaCarro(Carro c)

.

Até aqui tudo bem, o problema é que o tipos de carro são identificados por nº ou seja, são int, e eu no método do visitaCarro não consigo adicionar inteiros mas sim "carros", o que queria perguntar como é que resolvo está situação de modo a obter novos tipos de carro, adicionando através da outra class.

Espero que me possam ajudar.

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joseerodrigues

Viva,

De acordo com o meu entendimento, o Visitor utiliza-se para definir novas funcionalidades conforme o tipo, e não adicionar novos tipos.

Posto isto, acredito que o teu accept deve ter como parametro um visitor e não um "carro".

E antes de tudo mais, sem pensar em patterns, ou flags para definir tipos, um carro 4x4 não pode ser representado como uma subclasse de carro??

Qual a real necessidade do Visitor / flag para definir o tipo?

Cumprimentos,

José Rodrigues

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
op_h2tuga

Ola,

Eu tentei dar um exemplo parecido ao que tenho na realidade, mas já vi que não fui explicito, lol, para ser mais claro eu tenho um jogo, e tenho uma viatura que ataca inimigos, e tem 3 modos de ataque, e eu tenho que acrescentar outros 2 modos de ataque sem mexer na classe da viatura, entendeste?

Ou seja a necessidade do visitor é poder acrescentar novos modos de ataque sem que altere a classe, eu próprio é que presumi de acordo com o problema que tenho é a pattern visitor que melhor se adequa penso eu.

Eu tenho a necessidade de adicionar esse modos de ataque sem a classe viatura, é possivel da maneira que me disseste alterando o parâmetro para visitor?

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joseerodrigues

Ok, com a descrição real da necessidade que tens as coisas ficam mais claras :thumbsup:

Na minha opinição:

Ao implementares o visitor correctamente (accept (Visitor blah)) consegues fazer o que pretendes, terás é que andar sempre a registar o visitor correspondente ao método de ataque que pretendes, quando chegar a altura do utilizar.

Assim sendo, como neste caso vais estar sempre a agir sobre o mesmo "tipo" (class type), cada visitor concreto seria apenas uma "strategy mascarada", acredito que mais vale utilizares estrategias propriamente ditas...

Continuas a poder usar composição para definir modos de ataque, continuas a separar as operações do "tipo", etc.

ex:


Biatura b = Stand.createMegaBiatura();

// attack pode ter como args : Enemy enemyObj, AttackStrategy attackMode
// delega para attackMode.attack(enemyObj)
// ignora a criação de nova instancia. Estrategias devem ser imutaveis e reutilizadas.
b.attack(enemyObj, new RasenganAttackStrategy());

// ----------------------------

interface AttackStrategy

void attack(Enemy enemy);

Cumprimentos,

José Rodrigues

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
aladino77

Viva!

Pensaste e bem o pattern visitor é mesmo pra fazer isso! Permite acrescentar funcionalidades sem mexer nas classes.

Sobre o id, e outras informações de que o visitor precisa,  devem ser passados no construtor. 

A titulo de exemplo um visitor de ataques que apenas funciona em carros e só pode ser utilizado contra outros carros.

class CarroMegaAtaqueVisitor implements AtaqueVisitor {


private List<Carro> carros;

public CarroMegaAtaqueVisitor (List<Carro> carros) {
	this.carros = carros;
}


public void visit(Carro carro) {


for(Carro umCarro : carros) {
	if (!umCarro.equals(carro) && carro.noAlcance(unCarro)) {
		//Codigo que faz o Mega ataque
	}
}


public void visit(Aviao aviao) {
}


public void visit(Barco barco) {
    }
}


Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.