Null-objekti (suunnittelukuvio)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 16. syyskuuta 2017 tarkistetusta versiosta . tarkastukset vaativat 15 muokkausta .

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]

Kuvaus

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:

Rakenne

UML : n luokkakaaviossa suunnittelumalli esitetään seuraavasti:

Esimerkkejä

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 ()

Rubiiniesimerkki _

Rubyn lähdekoodi moduuli NullObject #AbstractEntity luokka AbstractEntity def doSomething nosta NoMethodError . Uusi loppu loppu #RealEntity luokka RealEntity < AbstractEntity def doSomething laittaa "RealEntity > Do Something" loppu loppu # NullEntity luokka NullEntity < AbstractEntity def doSomething nolla loppu loppu loppu #Asiakas moduuli asiakas sisältää NullObjectin realEntity = RealEntity . Uusi nullEntity = NullEntity . Uusi laittaa "RealEntity:" # => RealEntity todellinen Entiteetti . doSomething # => RealEntity > DoSomething laittaa "NullEntity:" # => NullEntity: nullEntity . teeJotain #ei tulosta loppu

Muistiinpanot

  1. Woolf, Bobby. Ohjelmasuunnittelun mallikielet 3  (uusi) / Martin, Robert; Riehle, Dirk; Buschmann, Frank. - Addison-Wesley , 1998.
  2. http://sourcemaking.com/design_patterns/null_object Arkistoitu 15. kesäkuuta 2012 Wayback Machine SourceMaking Tutorialissa

Linkit