Dizajn Modele PHP - modeli Observer
Unë kam qenë duke lexuar Modele parë Shef Dizajn kohët e fundit dhe kanë vendosur për të shkruar disa prej modeleve si shembuj PHP për të mirën time. E para që unë kam vendosur të kodit lart është modeli Observer . Përkufizimi formal i modeli Observer është i:
Model vëzhgues (një mesin e të asinkron publikon / regjistroheni model ) është një software të projektimit model në të cilin një objekt , i quajtur subjekt, mban një listë të ngarkim të tij, i quajtur vëzhguesit, dhe njofton ata automatikisht për çdo ndryshim të shtetit, zakonisht duke e quajtur një prej tyre metodave . Ajo është përdorur kryesisht për të zbatuar sistemet e trajtimit të shpërndarë ngjarje.
Si sistemet e të bëhen më shoqëruar lirshëm duke u siguruar se kur një ngjarje ndodh të gjitha sistemeve që kërkojnë njohuri të këtyre më të reja janë të informuar. Për shembull, një blog post, pas shpëtuar një post mund të na duhet për të rinovuar një motor kërkimi (p.sh. Lucene), përditësimin sitemap tonë, tags, përdoruesit e regjistruar email, etj model vëzhguesi lejon zhvilluesve të shtuar dëgjuesit shtesë pa redaktimi objekt i dukshëm . Duke injektuar vëzhguesit (dmth. një motor kërkimi vëzhgues update, një gjenerator sitemap, etj) në një subjekt (dmth. pas blog redaktimi sistemit) ne mund të lejojë që ajo të kryejë të gjitha të rejat e nevojshme pa ndonjë ndryshim.
Para se modeli Observer u identifikua mashtrim e zakonshme do të jetë për të rinovuar objektin e dukshme me një linjë të tjera të kodit për të rinovuar sistemin e nevojshme, dhe largimin e linjës e kodit sipas nevojës. Kjo nuk e lejon të lehtë duke shtuar dhe hequr vëzhgues.
Përditësime nënshtrohen të gjithë vëzhguesit e saj nëpërmjet një metodë update. Kjo metodë përditësimin e quan një metodë në çdo vëzhguesi i cili rrjedh nga zbatimi i një interface. Vëzhguesit mund të shtoni një hiqni veten përmes metodave në objekt i dukshëm.
Kjo është në thelb ajo! Unë të gjeni gjithmonë një shembull të jetë metoda më e mirë e të mësuarit / kuptuar kështu që këtu është shembull i koduar time deri ...
Pattern vëzhguesit në PHP
Në shembullin tim kam krijuar një sistem të lajmeve (NewsAggregator), i cili dërgon përditësime titull lajmet me lajme më të vogla feeds. Këtu sytem lajme zë vendin e subjektit, të vëzhgueshme, etj ndërsa Lajme të marrë rolin e vëzhguesve apo dëgjuesit.
Vëzhguesit Pasi initialised mund të bashkëngjitni dhe shkëputjen e tyre nga subjekti si ata e gjykojnë të arsyeshme. Në shembullin e mia unë kam krijuar tre vëzhgues, këto scan titujt dërguar nga subjekti dhe "bërtasin" lajmet nëse është e përshtatshme të saj. Vëzhguesit janë emëruar tre më poshtë së bashku me kushtet që ata scan për të, kur marrin titujt e lajmeve:
- Sport Observer: 'rugby', 'futbollit', 'tenisit'
- Observer News: 'politikë', 'financave', 'qeveria'
- Gossip Observer: "celebrity", "muzika", 'fashion'
Pas initalising subjekt shtoj lajmeve dhe vëzhguesit thashetheme dhe të dërgojë një update lajmeve. Pas këtij vëzhguesi sport është shtuar para se të rejat më të lajmeve janë dërguar jashtë. Së fundi vëzhguesi thashetheme është hequr para një titull përfundimtar lajm është dërguar.
Të tre klasa të ndryshme vëzhgues të zbatuar Observer interface, kjo u jep atyre një metodë të qartë ndërfaqe / përmes të cilave ata do të marrin më të reja. Me kusht që të zbatojnë interface Observer ata do të jenë në gjendje të bashkëngjitni veten në këtë temë. Kjo gjithashtu mban me paradigmën e programimit të "programit të nderfaqet nuk Implementimi '. Klasa e NewsAggregator shtrihet Subject abstrakte klasë, e cila na jep me tri metodat e nevojshme publike:
- updateObservers ()
- addObserver ()
- removeObserver ()
Kodi mund të shihet duke këtu, modeli Observer Vrapimi në PHP , dhe kodi mund të shkarkohet nga këtu, modeli Observer në Kodin PHP .
Observer Script
<? Php / ** * Kjo skedë përmban vëzhguesit * * @ Author Lloyd Watkin * @ Viti 2009/12/23 * / Subjekti Abstract klasës { abstract addObserver publike function (Observer vëzhgues $); abstract removeObserver publike funksionin (Observer vëzhgues $); updateObservers abstrakte publike function ($ newsHeadline); } / ** * Kjo është klasa subjekt për shembull * * @ Author Lloyd Watkin * @ Viti 2009/12/23 * / ArticleAggregator klasës shtrihet Subject { / ** * Mban një listë të vëzhguesve tanë * * @ Array var * / mbrojtur $ _observerList = array (); / ** * Metoda për të shtuar një vëzhgues * * @ Var Observer $ vëzhgues * @ Pavlefshëm kthimit * / addObserver publike function (Observer $ vëzhgues) { $ This-> _observerList [] = $ vëzhgues; } / ** * Metoda për të hequr një vëzhgues * * @ Var Observer $ vëzhgues * @ Boolean e kthimit * / removeObserver publike function (Observer $ vëzhgues) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ vëzhgues) { unset ($ this-> _observerList [$ kryesore]); return true; } } kthimit të rreme; } / ** * Metoda për të rinovuar vëzhgues * * @ Var $ string newsHeadline * @ Pavlefshëm kthimit * / updateObservers publike function ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> rinovuar ($ newsHeadline); } } / ** * Shto një histori e re e lajmeve * * @ Var $ string Historia * @ Pavlefshëm kthimit * / addNewsStory publike function ($ histori) { if (bosh ($ tregim) | |! is_string ($ tregim)) { hedhin InvalidArgumentException ri ('pritur një histori e lajmeve'); } $ This-> updateObservers ($ tregim); } }
Subject / dukshëm Script
<Php / ** * Kjo skedë përmban subjekti * * @ author Lloyd Watkin * @ viti 2009/12/23 * / Titulli abstrakte klasë abstrakte {addObserver publike function (Observer $ vëzhgues); abstrakte removeObserver publike function (Observer $ vëzhgues ); updateObservers abstrakte publike function ($ newsHeadline);} / ** * Kjo është klasa subjekt për shembull * @ Autori Lloyd Watkin * @ viti 2009/12/23 * / ArticleAggregator klasë shtrihet Subject {/ ** * mban një listë të vëzhguesve tanë * * @ var array * / $ mbrojtur _observerList = array (); / ** * Metoda për të shtuar një vëzhgues * * @ var Observer vëzhgues $ * @ pavlefshme kthimit * / addObserver publike function (Observer $ vëzhgues) {$ this-> _observerList [] = $ vëzhgues;} / ** * Metoda për të hequr një vëzhgues * * @ var Observer vëzhgues $ * @ kthimit boolean * / removeObserver publike funksionin (Observer $ vëzhgues) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ vëzhgues) {unset ($ this-> _observerList [$ kryesore]) return true;}} false;} / ** * Metoda për të rinovuar vëzhgues * * @ string var $ newsHeadline * @ pavlefshme kthimit * / updateObservers publike function ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> rinovuar ($ newsHeadline);}} / ** * Shto një histori e re e lajmeve * * @ var $ string histori * @ kthimit void * / addNewsStory publike function ($ tregim) {if (bosh ($ tregim) | |! is_string ($ tregim)) {hedhin InvalidArgumentException ri ('një lajm i pritur histori ');!} $ this-> updateObservers ($ tregim);}} Controller Script
<? Php / ** * Dizajni Observer modeli Shembull * * @ Author Lloyd Watkin * @ Viti 2009/12/23 * @ Http://www.evilprofessor.co.uk Lidhje * / përfshijnë "observers.php '; përfshijnë "subject.php '; if (! bosh ($ _SERVER ['HTTP_USER_AGENT'])) { 'echo';} / / Çfarë po bëjmë ne? echo "Pattern Observer Shembull në PHP. PHP_EOL;'================================' jehonë. PHP_EOL; / / Set up subjektit tonë $ subjekt ArticleAggregator = new (); echo '- ArticleAggregator krijuar'. PHP_EOL; / / Shto disa vëzhgues $ subjekt-> addObserver (e re NewsObserver ()); $ subjekt-> addObserver ($ gossiper = new GossipObserver ()); echo '- Shtuar NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Beep,, bip bip ... Lajme Flash! echo 'Newsflash: celebrity rugby player do financave ". PHP_EOL; echo'============================================== == '. PHP_EOL; $ subjekt-> addNewsStory ('celebrity rugby player do financave'); echo PHP_EOL; echo '- SportObserver ka gjetur dhe do të bashkohet me grupin! "; $ Subjekt-> addObserver (e re SportObserver ()); echo PHP_EOL . PHP_EOL; / / Beep,, bip bip ... Lajme Flash! 'Newsflash: Qeveria messes up përsëri! "echo . PHP_EOL;'=======================================' jehonë. PHP_EOL; $ subjekt-> addNewsStory ('messes qeveria përsëri!'); Echo PHP_EOL; / / Beep, bip, bip ... Lajme Flash! 'Newsflash: modës dhe futbollit të kombinuar "echo. PHP_EOL;'=======================================' jehonë. PHP_EOL; $ subjekt-> addNewsStory ('modës dhe futbollit të kombinuar'); echo PHP_EOL; / / Beep,, bip bip ... Lajme Flash! echo 'Newsflash: muzikë dhe politikë, çfarë tjetër? " . PHP_EOL;'==========================================' jehonë. PHP_EOL; $ subjekt-> addNewsStory ('muzikës dhe politikës, çfarë tjetër?'); Echo PHP_EOL; / ** * Gossipers rritet lodhur e lajmeve shumë shpejt dhe kanë vendosur për të ndaluar * dëgjuar, pavarësisht të gjitha lajmet interesante sot! * / Echo "- GossipObserver është mërzitur dhe e lë të grupit!" . PHP_EOL. PHP_EOL; $ subjekt-> removeObserver ($ gossiper); / / Beep,, bip bip ... Lajme Flash - Update to një histori më parë! echo 'NewsUpdate: modës dhe futbollit të kombinuar thotë'. 'Qeveria'. PHP_EOL; echo'============================================== == '. '========='. PHP_EOL; $ subjekt-> addNewsStory ('modës dhe futbollit të kombinuar' thotë se qeveria '.); Echo PHP_EOL; if (! _SERVER Bosh ($ [' HTTP_USER_AGENT '])) {echo'';
}


















































Përshëndetje,
Së pari, anglisht im është shumë i dobët, atëherë
Mund të më thoni se çfarë është sistemi në foto?
12 Fedora?
Cila është tema?
Përshëndetje,
Mund të më thoni se çfarë është sistemi në foto?
Fedora 12?
Cila është tema?
Fedora saj 11 me KDE aplikuar. Glasslooks theme Unë besoj.