Padrões de Projeto PHP - Pattern Observer
Estive lendo Patterns Head First Design de recentemente e decidi escrever alguns dos padrões como exemplos PHP para o meu próprio benefício. O primeiro que eu decidi código acima é o padrão Observer . A definição formal do padrão Observer é:
O observador padrão (um subconjunto do assíncrona publish / subscribe padrão ) é um software padrão de design em que um objeto , chamado o assunto, mantém uma lista de seus dependentes, chamados observadores, e notifica-los automaticamente de qualquer mudança de estado, geralmente chamando um de seus métodos . É usado principalmente para implementar sistemas de manuseio distribuídos evento.
Como os sistemas se tornam mais flexível certificando-se que quando um evento acontece todos os sistemas que requerem o conhecimento dessas atualizações são informados. Por exemplo, um post de blog, depois de salvar um post que pode precisar atualizar um motor de busca (por exemplo, Lucene), atualizar nosso sitemap, tags, usuários de e-mail subscrito, etc O observador padrão permite aos desenvolvedores adicionar ouvintes adicionais sem editar o seu objeto observáveis . Pela injeção de observadores (ou seja, um motor de busca observador atualização, um gerador de sitemap, etc) em um assunto (blog, isto é pós sistema de edição), podemos permitir que a ela para realizar todas as atualizações necessárias, sem quaisquer alterações.
Antes de o padrão Observer foi identificado o truque habitual seria para atualizar o objeto observável com uma linha de código adicional para atualizar o sistema necessário, e remover a linha de código, conforme necessário. Este não permite facilmente a adição e remoção de observadores.
As atualizações sujeitos todos os seus observadores através de um método de atualização. Este método de atualização chama um método em cada observador, que é derivada da implementação de uma interface. Observadores pode adicionar um retirar-se através de métodos no objeto observáveis.
E basicamente é isso! Eu sempre acho um exemplo a ser o melhor método de aprendizagem / compreensão por isso aqui está o meu exemplo codificado até ...
Pattern Observer em PHP
No meu exemplo eu criei um sistema de notícias (NewsAggregator) que envia atualizações de headline news feeds menor notícia. Aqui o sytem notícias toma o lugar do Sujeito, observáveis, etc enquanto a feeds de notícias assumir o papel dos observadores ou ouvintes.
Observadores, uma vez inicializado pode ligar e desligar-se do assunto como bem entenderem. No meu exemplo eu criei três observadores, esses scan as manchetes enviados pelo assunto e "gritar" a notícia de que a sua adequada. Os três observadores são nomeados abaixo, juntamente com os termos que procurar quando receber notícias:
- Desporto Observer: "o rugby ',' football ',' tênis '
- Notícias Observer: "política ',' financiamento ',' governo '
- Observer fofoca: 'celebridade', 'música', 'fashion'
Depois initalising o assunto eu adiciono as notícias e fofocas observadores e enviar uma atualização de notícias. Depois disso, o observador esporte é adicionado antes de mais atualizações de notícias são enviados para fora. Por fim, o observador a fofoca é removida antes de uma manchete de notícia final é enviada para fora.
As três classes diferentes de observador implementar o Observer interface, isso dá-lhes um método claro interface / através do qual receberão as atualizações. Desde que implementar a interface Observer que será capaz de unir-se ao assunto. Isso também mantém com o paradigma de programação de "programa de interfaces não implementações. A classe estende a NewsAggregator Assunto classe abstrata, que nos fornece os três necessários métodos públicos:
- updateObservers ()
- addObserver ()
- removeObserver ()
O código pode ser visto correndo aqui, Pattern Observer em PHP Executando , eo código pode ser baixado aqui, Pattern Observer no código PHP .
Observador Script
<? Php / ** * Este arquivo contém os observadores * * @ Author Lloyd Watkin * @ Since 2009/12/23 * / Assunto classe abstrata { addObserver função abstrata público (Observer observador $); removeObserver função abstrata público (Observer observador $); public abstract updateObservers função ($ newsHeadline); } / ** * Esta é a classe de assunto para o exemplo * * @ Author Lloyd Watkin * @ Since 2009/12/23 * / ArticleAggregator classe estende Assunto { / ** * Mantém uma lista de nossos observadores * Array * @ var * / protected $ _observerList = array (); / ** * Método para adicionar um observador * * @ Var $ Observer observador * @ Return void * / addObserver função pública (Observer $ observador) { $ This-> _observerList [] = $ observador; } / ** * Método para remover um observador * * @ Var $ Observer observador * @ Return boolean * / removeObserver função pública (Observer $ observador) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ observador) { unset ($ this-> _observerList [$ key]); return true; } } return false; } / ** * Método para atualizar os observadores * * @ Var string $ newsHeadline * @ Return void * / pública updateObservers função ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> update ($ newsHeadline); } } / ** * Adicionar uma nova notícia * * @ Var string $ história * @ Return void * / addNewsStory função pública ($ história) { if (empty ($ história) | |! is_string ($ história)) { throw InvalidArgumentException novo ('esperado uma notícia!'); } $ This-> updateObservers ($ história); } }
Assunto / Observable Script
? <Php / ** * Este arquivo contém o assunto * * @ author * @ Lloyd Watkin desde 2009/12/23 * / Assunto classe abstrata {addObserver função abstrata público (Observer $ observador); removeObserver função abstrata público (Observer $ observador ); abstrata updateObservers função pública ($ newsHeadline);} / ** * Esta é a classe de assunto para o exemplo * * @ author * @ Lloyd Watkin desde 2009/12/23 * / ArticleAggregator classe estende Assunto {/ ** * Mantém uma lista de nossos observadores * * @ var array * / protected $ _observerList = array (); / ** * Método para adicionar um observador * * @ var $ Observer observador * @ return void * / addObserver função pública (Observer $ observador) {$ this-> _observerList [] = $ observador;} / ** * Método para remover um observador * * @ var $ Observer observador * @ return boolean * / removeObserver função pública (Observer $ observador) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ observador) {unset ($ this-> _observerList [$ key]); return true;}} return false;} / ** * Método para atualizar os observadores * * @ var string $ newsHeadline * @ return void * / updateObservers função pública ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> update ($ newsHeadline);}} / ** * Adicionar uma notícia nova * * @ var string $ história * @ return void * / addNewsStory função pública ($ história) {if (empty ($ história) | | is_string ($ história)!) {throw InvalidArgumentException novo ('esperado uma notícia história ');} $ this-> updateObservers ($ história);}} Controlador de Script
<? Php / ** * Exemplo Design Pattern Observer * * @ Author Lloyd Watkin * @ Since 2009/12/23 * @ Http://www.evilprofessor.co.uk ligação * / include 'observers.php'; include 'subject.php'; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo ''; } / / O que estamos fazendo? 'Exemplo Pattern Observer em PHP "echo. PHP_EOL; echo'================================'. PHP_EOL; / / Set up nosso assunto $ Subject = ArticleAggregator new (); echo '- ArticleAggregator criado ". PHP_EOL; / / Add alguns observadores $ Subject-> addObserver (novo NewsObserver ()); $ Subject-> addObserver ($ gossiper = new GossipObserver ()); echo '- Adicionado NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / Beep /, bip, bip ... News Flash! echo 'NewsFlash: celebridades jogador de rugby ama financiamento ". PHP_EOL; echo'================================================ '. PHP_EOL; $ Subject-> addNewsStory ('celebridade jogador de rugby ama finanças'); echo PHP_EOL; echo '- SportObserver descobriu e quer se juntar ao grupo'; $ Subject-> addObserver (novo SportObserver ()); echo PHP_EOL. PHP_EOL; / Beep /, bip, bip ... News Flash! "NewsFlash: governo mexe-se outra vez! 'echo . PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ("messes governo de novo! '); echo PHP_EOL; / Beep /, bip, bip ... News Flash! "NewsFlash: moda e futebol combinam 'echo. PHP_EOL; echo'======================================='. PHP_EOL; $ Subject-> addNewsStory ('moda e futebol combinam'); echo PHP_EOL; / Beep /, bip, bip ... News Flash! echo 'NewsFlash: música e política, o que vem depois? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Subject-> addNewsStory ("música e política, o que vem depois? '); echo PHP_EOL; / ** Gossipers * cansar de notícias muito rapidamente e decidiram * Para parar de ouvir, apesar de todas as notícias interessantes hoje! * / echo '- GossipObserver está entediado e deixa o grupo! " . PHP_EOL. PHP_EOL; $ Subject-> removeObserver ($ gossiper); / Beep /, bip, bip ... News Flash - Update para uma história mais cedo! echo 'NewsUpdate: moda e futebol combinam diz. "Governo". PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Subject-> addNewsStory ('moda e futebol combinam'. 'Diz que o governo'); echo PHP_EOL; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';
}


















































Olá,
Primeiro, o meu Inglês é muito pobre, então
Você pode me dizer qual é o sistema na foto?
fedora 12?
Qual é o tema?
Olá,
Você pode me dizer qual é o sistema na foto?
Fedora 12?
Qual é o tema?
Seu fedora 11 com KDE aplicada. Glasslooks tema que eu acredito.