Olio -ohjelmoinnissa Null Object on objekti, jolla on tietty neutraali ("nolla") käyttäytyminen. Null Object -suunnittelumalli kuvaa tällaisten objektien käyttöä ja niiden käyttäytymistä (tai sen puutetta). Julkaistu ensimmäisen kerran Pattern Languages of Program Design -kirjasarjassa . [yksi]
Oliopohjaisissa kielissä , kuten Java tai C# , objektit voivat olla NULL . Viittaukset tällaisiin objekteihin on tarkistettava tyhjäksi ennen käyttöä, koska "null"-objektin luokan menetelmiä ei yleensä voida kutsua.
Null-objektin tarkoitus on kapseloida objektin puuttuminen korvaamalla se toisella objektilla, joka ei tee mitään.
Tätä suunnittelumallia suositellaan, kun:
UML : n luokkakaaviossa suunnittelumalli esitetään seuraavasti:
Esimerkki C# :ssa
Lähdeteksti C# /* * Esimerkki Null Object -mallin käytöstä: */ voidMain ( ) { AbstractEntity realEntity = uusi RealEntity (); todellinen Entiteetti . tee jotain (); // RealEntity::doSomething AbstractEntity unknownEntity = uusi NullEntity (); tuntematon Entiteetti . tee jotain (); // ei lähtöä } // Määritä muut menetelmät ja luokat tässä julkinen abstrakti luokka AbstractEntity { julkinen abstrakti void doSomething (); } julkinen luokka RealEntity : AbstractEntity { julkinen ohitus void doSomething () { konsoli . WriteLine ( "RealEntity::doSomething" ); } } julkinen luokka NullEntity : AbstractEntity { julkinen ohitus void doSomething () { // tekemättä mitään } }Esimerkki PHP :ssä
PHP lähdekoodi /* * Esimerkki Null Object -mallin käytöstä: */ ilmoittaa ( tiukat_tyypit = 1 ); nimiavaruus DesignPatterns \ Behavioral \ NullObject ; palveluluokkaa _ { julkinen funktio __construct ( yksityinen Logger $ logger ) { } /** * tee jotain ... */ julkinen tehtävä doSomething () { // Huomaa tässä, että sinun ei tarvitse tarkistaa, onko loggeri asetettu esim. is_null(), käytä sen sijaan vain sitä $ this -> logger -> log ( ' Olemme in ' . __METHOD__ ) ; } } /** * Keskeinen ominaisuus: NullLoggerin on perittävä tästä käyttöliittymästä kuten kaikkien muiden loggerien */ käyttöliittymä Loggeri { julkinen funktioloki ( merkkijono $ str ) ; } luokan PrintLogger toteuttaa Loggerin { julkinen funktioloki ( merkkijono $ str ) _ { echo $ str ; } } luokan NullLogger toteuttaa Loggerin { julkinen funktioloki ( merkkijono $ str ) _ { // Älä tee mitään } } $ servicePrint = uusi palvelu ( uusi PrintLogger ()); $ servicePrint -> doSomething (); // 'Olemme kohdassa DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = uusi palvelu ( uusi NullLogger ()); $ serviceNull -> doSomething (); // (Älä tee mitään)Java esimerkki
Java lähde /* * Pattern Null -objekti. */ public class Main { public static void main ( String [ ] args ) { AbstractEntity realEntity = uusi RealEntity (); todellinen Entiteetti . tee jotain (); // RealEntity::doSomething AbstractEntity unknownEntity = uusi NullEntity (); tuntematon Entiteetti . tee jotain (); // ei lähtöä } } abstrakti luokka _ _ julkinen abstrakti void doSomething (); } class RealEntity laajentaa AbstractEntity { @Ohittaa public void doSomething () { Järjestelmä . ulos . println ( "RealEntity::doSomething" ); } } class NullEntity laajentaa AbstractEntity { @Ohittaa public void doSomething () { } }Esimerkki Pythonissa
Lähdekoodi Pythonissa # Pattern Null -objekti. luokka AbstractEntity : def doSomething ( itse ): kulkea luokka RealEntity ( AbstractEntity ): def doSomething ( itse ): tulosta ( "RealEntity.doSomething" ) luokka NullEntity ( AbstractEntity ): def doSomething ( itse ): kulkea def tärkein (): real_entity = RealEntity () todellinen_entiteetti . tehdä jotain () unknown_entity = NullEntity () tuntematon_entiteetti . tehdä jotain () if __name__ == "__main__" : tärkein ()Suunnittelumalleja | |
---|---|
Main | |
Generatiivinen | |
Rakenteellinen | |
Käyttäytyminen | |
Rinnakkaisohjelmointi _ |
|
arkkitehtoninen |
|
Java EE -mallit | |
Muut mallit | |
Kirjat | |
Persoonallisuudet |