Observer pattern

Pessoal, estou com sérios problemas quanto a implementação do padrão Observer. Como faço para que a notifação chegue até o observador? A aplicação é um simples chat e estou fazendo da seguinte maneira:

                                    <h:form id="form2">
				                    <h:outputText value="#{ Main.usuarioBean.usuario.apelido }"/>                     
					                <h:inputText value="#{ Main.painelMensagem.mensagem }" id="mensagem"/>
			                       
			                        <h:commandButton value="Enviar mensagem !">
			                          <f:ajax event="click"
			                                  execute=":form2:mensagem" 
			                                  render=":form1:" />
		                          
			                        </h:commandButton>	               	         
			            </h:form>	
			        <h:form id="form1">
			        <!-- <p:poll interval="3" update=":form1:" />  -->
				        <h:panelGroup id="painelChatMensagens">
		                        <h:outputText value="Ultima mensagem: #{Main.painelMensagem.mensagem}"/>
		                        <h:dataTable value="#{Main.painelMensagem.mensagens}" var="msg">
		                            <h:column>#{msg}</h:column>
		                        </h:dataTable>                 
		                   
				        </h:panelGroup>
			        </h:form>
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import com.marcelodeandrade.usuario.UsuarioBean;

@ManagedBean(name = "Main")
public class Main {

	@ManagedProperty(value = "#{UsuarioBean}")
	private UsuarioBean usuarioBean;	
	private PainelMensagem painelMensagem;

	public Main(){
		painelMensagem = PainelMensagem.getInstancia();				
	}
	
	@PostConstruct
	public void aposConstrutor(){
		painelMensagem.adicionarObservador(getUsuarioBean());	
	}
	
	public PainelMensagem getPainelMensagem() {
		return painelMensagem;
	}

	public void setPainelMensagem(PainelMensagem painelMensagem) {
		this.painelMensagem = painelMensagem;
	}

	public UsuarioBean getUsuarioBean() {
		return usuarioBean;
	}

	public void setUsuarioBean(UsuarioBean usuarioBean) {
		this.usuarioBean = usuarioBean;
	}
	

}


import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedProperty;

import com.marcelodeandrade.observer.Objeto;
import com.marcelodeandrade.observer.Observador;
import com.marcelodeandrade.usuario.UsuarioBean;

public class PainelMensagem implements Objeto {

	private String mensagem;
	private List<Observador> observadores;
	private List<String> mensagens;
	private static PainelMensagem instancia;
	
	@ManagedProperty(value = "#{UsuarioBean}")
	private UsuarioBean usuarioBean;	
	
	public PainelMensagem(){
		this.observadores = new ArrayList<Observador>();
		this.mensagens = new ArrayList<String>();
	}
	
	public static PainelMensagem getInstancia(){
		if( instancia == null){
			instancia = new PainelMensagem();
		} 
		return instancia;
	}
	
	public List<String> getMensagens() {
		return mensagens;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem =  mensagem;
		this.mensagens.add(mensagem);
		notificarObservadores();
		return;
	}

	@Override
	public void adicionarObservador(UsuarioBean usuarioBean) {
		this.observadores.add(usuarioBean);
	}

	@Override
	public void removerObservador(UsuarioBean usuarioBean) {
		this.observadores.remove(usuarioBean);		
	}

	@Override
	public void notificarObservadores() {
		for( Observador observador : this.observadores){
			observador.atualizarMensagem(this.mensagem);			
		}
	}
	
	public List<Observador> getObservadores() {
		return observadores;
	}

}

Ainda não obtive sucesso.