Como refatorar código comum

Pessoal, estou com o seguinte código:

[code]private synchronized void disparaCartaSemDestinatario() {
GeradorDeCartaEvent evento = new GeradorDeCartaEvent(this);
Iterator i = geradorListeners.iterator();
while (i.hasNext()) {
((GeradorDeCartaListener)i.next()).cartaSemDestinatario(evento);
}
}

private synchronized void disparaCartaComumCriada() {
GeradorDeCartaEvent evento = new GeradorDeCartaEvent(this);
Iterator i = geradorListeners.iterator();
while (i.hasNext()) {
((GeradorDeCartaListener)i.next()).cartaComumGerada(evento);
}
}

private synchronized void disparaCartaEletronicaCriada() {
GeradorDeCartaEvent evento = new GeradorDeCartaEvent(this);
Iterator i = geradorListeners.iterator();
while (i.hasNext()) {
((GeradorDeCartaListener)i.next()).cartaEletronicaGerada(evento);
}
}[/code]

Estou implementando o padrão observer. No exemplo acima há muita coisa que se repete (só muda a linha de lançamento do evento). Há alguma forma de refatorar esse código a fim de aproveitar o código comum aos 3 métodos?
Agradeço desde já =] [/code]

Oi

Jemerson, não se estaria contra o padrão, mas vc poderia retirar o conteúdo de dopis métodos, e nesses métodos, fazer uma chamada para o método que ficou com o conteúdo.

T+

Oi Jemerson,

Não sou muito bom nisto, mas acredito que você consegueria o que quer criando uma interface com o metodo “disparaCarta()” e implementando esta interface nas suas classes que tratam as diferentes cartas que estariam populando o iterator, assim seu metodo ficaria mais ou menos assim:

private synchronized void disparaCarta() {
GeradorDeCartaEvent evento = new GeradorDeCartaEvent(this);
Iterator i = geradorListeners.iterator();
while (i.hasNext()) {
((DisparaCartaInterface)i.next()).disparaCarta(evento);
}
}

A implementação do metodo disparaCarta(envento) seria diferente em cada um dos objetos do iterator usando assim o recurso do polimorfismo.

Espero que tenha ajudado em algo.

Abraço

Darcy