Qual é o ponto de observador padrão?

votos
-4

Atualmente estou aprendendo Java e é bastante interessante, mas algo realmente me incomoda. Eu entendo como usar o padrão observador, mas não consigo encontrar qualquer uso real para ele. Eu, obviamente, vimos alguns exemplos, mas eu achei que ele iria tornar o código mais complicado e que havia muitas maneira mais simples de fazer essas coisas.

Então, se alguém tem uma explicação simples / example, onde o padrão Observer teria realmente um utilitário, eu apreciaria.

obrigado

Publicado 22/06/2015 em 22:06
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Você está postando uma pergunta sobre estouro de pilha, e todos nós se notificado de que a questão foi postado. Isso é observador padrão.

Respondeu 22/06/2015 em 22:09
fonte usuário

votos
0

Por uma questão de uma boa e simples exemplo, vamos imaginar sistemas operacionais foram escritos em Java. Teríamos, então, uma classe Mouse, e muitas aplicações que deseja responder a cliques do mouse.

A abordagem ingênua seria para cada aplicação de perguntar constantemente o rato se o botão do mouse está pressionado:

class MyApplication {
    void run() {
        for (;;) {
            if (Mouse.isLeftButtonDown()) {
                // do something
            }
        }
    }
}

Isto tem a desvantagem de que, se o botão do rato não for pressionado, temos um segmento que constantemente executa esse loop. Isto é particularmente ruim se cada aplicação fez isso. Sua CPU constantemente estar ocupado verificando o mouse, desnecessariamente consumindo energia e causando outros processos e programas para abrandar. A primeira melhoria seria adicionar um atraso de sono curto no loop:

class MyApplication {
    Mouse mouse;

    void run() {
        for (;;) {
            if (mouse.isLeftButtonDown()) {
                // do something
            }
            Thread.sleep(50);
        }
    }
}

Isso pouparia tempo de CPU, mas se o botão do mouse está para baixo menos de 50 ms (ou outro segmento por uma aplicação mal programada monopolizou a cpu, impedindo o nosso segmento de corrida), o aplicativo pode não notar o clique.

Estas questões podem perfeitamente ser evitado usando o padrão observador, com o mouse como sujeito, e as várias aplicações (ou janelas) como ouvintes:

class MyApplication implements MouseListener {
    MyApplication() {
        Mouse.subscribe(this);
    }

    @Override onLeftClick() {
        // do something
    }

    void close() {
        Mouse.unsubscribe(this);
    }
}

Concedido, por si só, esta tem apenas mudou-se o problema de detectar cliques do mouse do aplicativo para o sistema operacional. O sistema operacional ainda pode ter um clique assistindo segmento dedicado (que já seria muito mais recursos amigável do que um clique assistindo fio para cada aplicação). Mas o sistema operacional pode, por sua vez usar o observador padrão para delegar observando cliques para o hardware real, através da instalação de um ouvinte de evento para uma interrupção de hardware . Com essa solução, observando por cliques é feito por um circuito simples no próprio mouse, que pode detectar cliques do mouse com alta fidelidade, sem ocupar a CPU com o trabalho ocupado desnecessária.

Em suma, algo como como detecção confiável cliques básicas do mouse não seria realizado com a confiabilidade e eficiência que estamos acostumados, se não fosse para a percepção de que ele pode ser mais conveniente para ser notificado de um evento que constantemente verificar se ocorreu um evento nós mesmos.

Respondeu 22/06/2015 em 22:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more