Padrões de Projeto PHP - O padrão Observer
Estive lendo o Head First Design Patterns recentemente e decidi escrever alguns dos padrões, como exemplos de PHP para 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 de sujeito, mantém uma lista de seus dependentes, como "observadores", e notifica-los automaticamente de quaisquer mudanças de estado, geralmente por chamada um de seus métodos . É usado principalmente para implementar sistemas de manuseio de eventos distribuídos.
Como os sistemas se tornam mais flexível certificando-se que quando um evento acontece todos os sistemas que requerem o conhecimento destas actualizaçõ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, e-mail usuários cadastrados, etc O observador padrão permite aos desenvolvedores acrescentar mais ouvintes sem editar o seu objeto observáveis . Ao injetar os observadores (ou seja, uma pesquisa de observação actualização do motor, um gerador de sitemap, etc) em um assunto (ou seja, sistema de edição de post do blog) que pode permitir a ele para realizar todas as atualizações necessárias, sem quaisquer alterações.
Antes o padrão Observer foi identificado o truque habitual seria atualizar o objeto observável com uma linha de código adicional para atualizar o sistema necessário, e retirar a linha de código, conforme necessário. Isso não permite facilmente a adição e remoção de observadores.
As atualizações de todos os sujeitos de 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. O observador 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 exemplo do meu código acima ...
Observer Pattern em PHP
No meu exemplo criei um sistema de notícias (NewsAggregator) que envia atualizações de manchetes de notícias de menor feeds de notícias. Aqui, a notícia sytem toma o lugar do sujeito, observáveis, etc enquanto os feeds de notícias assumir o papel de observadores ou ouvintes.
Uma vez iniciado observadores pode conectar e desconectar-se do assunto como bem entenderem. No meu exemplo criei três observadores, esses digitalizar as manchetes enviada pelo assunto e "gritar" a notícia, se a sua adequada. Os três observadores são nomeados abaixo, juntamente com os termos que fazer a varredura para quando receber notícias:
- tênis "'rugby', Sport Observer:" futebol ",
- News Observer: 'política', 'Finanças', 'governo'
- moda "'Celebridade', Gossip Observer: 'music',
Após initalising o assunto que eu adicionar os observadores de notícias e fofocas e enviar uma atualização de notícias. Depois disso, o observador, o desporto é acrescentado antes das atualizações mais notícias são enviadas para fora. Por fim, o observador a fofoca é removida antes de uma manchete de jornal final é enviada para fora.
As três classes diferentes do observador implementar a interface Observer, isso dá-lhes uma interface clara e / ou método através do qual receberá atualizações. Desde que implementar a interface Observer que será capaz de unir-se ao assunto. Isto também se mantém com o paradigma de programação do '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, Observer Pattern em PHP duração , eo código pode ser baixado aqui, Observer Pattern em PHP Code .
Observador Script
<? Php / ** * Este arquivo contém os observadores * * @ Author Lloyd Watkin * @ Desde 2009/12/23 * / Assunto classe abstrata { addObserver função abstrata pública (Observador $ observador); removeObserver função abstrata pública (Observador $ observador); resumo público updateObservers função ($ newsHeadline); } / ** * Esta é a classe de assunto para o exemplo * * @ Author Lloyd Watkin * @ Desde 2009/12/23 * / ArticleAggregator classe estende Assunto { / ** * Mantém uma lista dos nossos observadores * * @ Var array * / protected $ _observerList = array (); / ** * Método para adicionar um observador * * @ Var $ Observador Observador Void * @ return * / addObserver função pública (Observador $ observador) { _observerList $ this-> [] = $ observador; } / ** * Método para remover um observador * * @ Var $ Observador Observador * @ Return boolean * / removeObserver função pública (Observador $ observador) { foreach ($ this-> _observerList AS $ key => $ ob) { if (ob == $ $ observador) { unset ($ this-> _observerList [$ chave]); return true; } } return false; } / ** * Método para atualizar os observadores * * @ var string $ newsHeadline Void * @ return * / updateObservers função pública ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { atualizar $ ob-> ($ newsHeadline); } } / ** * Acrescente uma notícia nova * * @ var string $ história Void * @ return * / addNewsStory função pública ($ estória) { if (história ($ vazio) | | is_string ($ história!)) { jogar InvalidArgumentException novo ('esperado uma notícia!'); } $ This-> updateObservers ($ história); } }
Assunto Script / Observable
? <Php / ** * Este arquivo contém o tema * * @ author * @ Lloyd Watkin desde 2009/12/23 * / Assunto classe abstrata {addObserver função abstrata pública (Observador $ observador); removeObserver função abstrata pública (Observador $ observador ); resumo updateObservers função pública ($ newsHeadline);} / ** * Esta é a classe de assunto para o exemplo * * @ author * @ Lloyd Watkin desde 2009/12/23 * / class ArticleAggregator 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 (Observador $ observador) _observerList {$ this-> [] = $ observador;} / ** * Método para remover um observador * * * @ var Observer observador $ @ return boolean * / removeObserver função pública (Observador $ observador) {foreach ($ this-> _observerList AS $ key => $ ob) {if (ob == observador $ $) {unset (_observerList $ this-> [$ chave]); 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) {$ atualização ob-> ($ newsHeadline);}} / ** * Adicionar uma nova história da notícia * @ var string * @ return $ história void * / addNewsStory função pública ($ estória) {if (história ($ vazio) | |! 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 * @ Desde 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / include 'observers.php; include 'subject.php; if (! empty ($ _SERVER ['HTTP_USER_AGENT'])) { echo '';} / / O que estamos fazendo? echo 'Exemplo Observer Pattern em PHP. PHP_EOL echo'================================'. PHP_EOL / / Configure o nosso assunto $ assunto ArticleAggregator = new (); echo '- ArticleAggregator criado. PHP_EOL / / Adicione alguns observadores addObserver $ assunto-> (novo NewsObserver ()); addObserver $ assunto-> ($ gossiper GossipObserver = new ()); echo '- Adicionado NewsObverser & GossipObserver. PHP_EOL. PHP_EOL / / bip, bip, bip, ... News Flash! echo 'NewsFlash: jogador de râguebi celebridade adora financiamento ". PHP_EOL echo'============================================== == '. PHP_EOL; $ assunto-> addNewsStory ("jogador de rugby celebridade adora financiar '); PHP_EOL echo echo" - SportObserver descobriu e quer se juntar ao grupo'; addObserver $ assunto-> (novo SportObserver ()); echo PHP_EOL . PHP_EOL / / bip, bip, bip, ... News Flash! echo 'NewsFlash: Governo mexe-se outra vez! " . PHP_EOL echo'======================================='. PHP_EOL; $ assunto-> addNewsStory ("governo mexe-se novamente! '); Echo PHP_EOL / / bip, bip, bip, ... News Flash! echo 'NewsFlash: moda e futebol combinam. PHP_EOL echo'======================================='. PHP_EOL; $ assunto-> addNewsStory («moda e futebol combinam '); echo PHP_EOL / / bip, bip, bip, ... News Flash! echo 'NewsFlash: música e política, o que vem depois? " . PHP_EOL echo'=========================================='. ("Música e política, o que vem depois? ') $ Assunto-> addNewsStory;; PHP_EOL eco PHP_EOL; / ** * fofoqueiros se cansam de novidades muito rapidamente e decidiram * parar de ouvir, apesar de todas as notícias interessantes hoje! * / Echo "- GossipObserver está entediado e deixa o grupo! . PHP_EOL. PHP_EOL; $ assunto-> removeObserver ($ gossiper); / bip, bip, bip ... Flash News - Atualização de uma história mais cedo! echo 'NewsUpdate: moda e futebol combinam diz. "Governo". PHP_EOL echo'============================================== == '. '========='. PHP_EOL; $ assunto-> addNewsStory («moda e futebol combinam ', diz governo'.); Echo PHP_EOL; if (! Empty ($ _SERVER ['HTTP_USER_AGENT'])) {echo '';
}



















































Olá,
Primeiro, 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?
Sua Fedora 11 com KDE aplicada. Glasslooks tema que eu acredito.