1. Modo de motivação
O estabelecimento de uma relação de dependência entre o objecto e o objecto irá notificar automaticamente outros objectos quando um objecto muda, os correspondentes outros objectos reagir. Aqui, o objeto é alterado é referido como um alvo de observação, e o objeto é referido como um espectador é notificado, o alvo de observação pode corresponder a uma pluralidade de observadores, não há nenhuma conexão entre eles e o espectador, pode ser aumentada como espectador necessário e de exclusão , tornando o sistema mais fácil de expandir, este é o motivo modo padrão de observador.
2. Schema Definition
O padrão observador (Observador Padrão): um tipo de dependências entre muitos definir o objecto, de tal modo que sempre que um estado do objeto alterações, as quais estão relacionadas com o objecto dependente de ser informado e actualizado automaticamente. O observador padrão também conhecido como publicar - modelo de subscrição (Publicação / Assinatura), o modelo - o modo de visualização (Model / View), fonte - ouvinte modo (Fonte / Listener) Modo ou subordinados (dependentes).
Pertencentes aos padrões de comportamento de objetos .
3. Modo Estrutura
Deve prestar atenção quando implementar o padrão observador não pode ser chamado diretamente entre o público-alvo específico e objetos observadores específicos manterá o forte acoplamento entre eles, em violação dos princípios de design orientado a objeto.
O principal papel do modo de observador são os seguintes:
- tópicos abstratos (Assunto) Papel: Também conhecido como um objeto classes abstratas, que fornece classe agregação e aumento para segurar um objeto espectador, métodos exclui o objeto de observação, métodos abstratos e notificação de todos os observadores.
- temas específicos (Concrete Assunto) Papel: também conhecido como classe alvo específico que implementa o objetivo resumo do método de notificação, quando as mudanças de tema específico estado interno, notificar todos os objetos observadores registado.
- Abstract observador (Observador) papel: é uma classe abstrata ou interface, que inclui uma atualizou seu método abstrato, ao receber tema específico de notificação de mudança é chamado.
- observador específico (observador concreto) papéis: os métodos abstratos definidos no observador abstrato implementadas a fim de atualizar seu status quando a obtenção de objetivos de notificação de alteração.
4. Código Modo
# 抽象观察者
public interface Observer {
// 观察者的反应
void response();
}
# 具体观察者
public class ConcreteObserver1 implements Observer {
@Override
public void response() {
System.out.println("具体观察者 1 作出反应");
}
}
public class ConcreteObserver2 implements Observer {
@Override
public void response() {
System.out.println("具体观察者 2 作出反应");
}
}
# 抽象主题
public abstract class Subject {
protected List<Observer> observerList = new ArrayList<>();
/**
* 新增观察者
*/
public void add(Observer observer) {
observerList.add(observer);
}
public void remove(Observer observer) {
observerList.remove(observer);
}
/**
* 通知观察者
*/
public abstract void notifyObserver();
}
# 具体主题
public class ConcreteSubject extends Subject {
@Override
public void notifyObserver() {
System.out.println("具体目标发生变化...");
for (Observer observer : observerList) {
observer.response();
}
}
}
# Client
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver1();
Observer observer2 = new ConcreteObserver2();
subject.add(observer1);
subject.add(observer2);
subject.notifyObserver();
subject.remove(observer1);
subject.notifyObserver();
}
}
Vejam-se alguns do código fonte vai descobrir que este padrão é bastante comum. Claro, o espectador pode fazer algo, passando alguns parâmetros.
5. Resumo
análise
- padrão Observer descreve como estabelecer um sistema de dependências entre objetos e objetos, como construir para atender a essa demanda.
- Esta meta observação tecla de modo e o objeto é para o espectador, um alvo pode ter qualquer número de com isso dependente do observador, uma vez que o estado de destino for alterado, todos os observadores são notificados.
- Em resposta a esta notificação, cada observador irá atualizar instantaneamente o seu estatuto, para sincronizar com o estado de destino, essa interação também chamado a editora - subscrever (PublishSubscribe). O objetivo é informar a editora, quando emitiu um aviso não precisa saber quem são seus observadores, não pode haver qualquer número de espectadores se inscrever e receber notificações.
vantagem
- Modo de separação observador pode representar uma camada de camada e de dados lógica e define uma mensagem de actualização mecanismo de transmissão estável, a abstracção interface de actualização, de maneira que pode haver uma grande variedade de diferentes camadas como uma representação específica do papel observador.
- Estabelecer um visualizador de modelo abstrato acoplado entre o alvo da observação e do observador.
- Suporta modo Observer transmitido comunicação.
- modo Observer atender aos requisitos de "abrir e fechar princípio".
deficiência
- Se um objeto-alvo de observação tem muitas observador direta e indireta, ele irá notificar todos os observadores tem que gastar um monte de tempo.
- Se há uma dependência circular entre o observador eo alvo observado, observar o alvo irá desencadear chamadas a circular entre eles, pode causar a falha do sistema.
- O observador padrão é nenhum mecanismo para permitir que o espectador sabe que o objeto alvo observado é como a mudança acontece, mas só sei para observar o alvo mudou.