I objektorienteret programmering er et nulobjekt et objekt med en bestemt neutral ("nul") adfærd. Null Object -designmønsteret beskriver brugen af sådanne objekter og deres adfærd (eller mangel på samme). Først udgivet i Pattern Languages of Program Design -bogserien . [en]
I objektorienterede sprog som Java eller C# kan objekter være NULL . Referencer til sådanne objekter skal kontrolleres for null, før de bruges, da metoderne i klassen af et "null"-objekt generelt ikke kan kaldes.
Formålet med et Null-objekt er at indkapsle fraværet af et objekt ved at erstatte det med et andet objekt, der ikke gør noget.
Dette designmønster anbefales, når:
I et klassediagram i UML er et designmønster repræsenteret som følger:
Eksempel i C#
Kildetekst i C# /* * Et eksempel på brug af Null Object-mønsteret: */ voidMain ( ) { AbstractEntity realEntity = ny RealEntity (); realEntity . gøre Noget (); // RealEntity::doSomething AbstractEntity unknownEntity = ny NullEntity (); ukendt Entitet . gøre Noget (); // ingen output } // Definer andre metoder og klasser her offentlig abstrakt klasse AbstractEntity { offentlig abstrakt void doSomething (); } offentlig klasse RealEntity : AbstractEntity { offentlig tilsidesættelse ugyldig gør Noget () { Konsol . WriteLine ( "RealEntity::doSomething" ); } } offentlig klasse NullEntity : AbstractEntity { offentlig tilsidesættelse ugyldig gør Noget () { // laver ingenting } }Eksempel i PHP
PHP kildekode /* * Et eksempel på brug af Null Object-mønsteret: */ erklære ( strenge_typer = 1 ); navneområde DesignPatterns \ Behavioral \ NullObject ; serviceklasse _ { offentlig funktion __construct ( privat logger $ logger ) { } /** * gør noget ... */ offentlig funktion gør Noget () { // bemærk her at du ikke skal tjekke om loggeren er sat med f.eks. is_null(), brug det i stedet $ this -> logger -> log ( ' Vi er med ' .__ METHOD__ ); } } /** * Nøglefunktion: NullLogger skal arve fra denne grænseflade som alle andre loggere */ interface Logger { offentlig funktionslog ( streng $ str ) ; } klasse PrintLogger implementerer Logger { offentlig funktionslog ( streng $ str ) _ { echo $ str ; } } klasse NullLogger implementerer Logger { offentlig funktionslog ( streng $ str ) _ { // gøre ingenting } } $ servicePrint = ny tjeneste ( ny PrintLogger ()); $ servicePrint -> doSomething (); // 'Vi er i DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = ny tjeneste ( ny NullLogger ()); $ serviceNull -> doSomething (); // (gøre ingenting)Java eksempel
Java kilde /* * Mønster Null objekt. */ offentlig klasse Main { public static void main ( String [] args ) { AbstractEntity realEntity = ny RealEntity (); realEntity . gøre Noget (); // RealEntity::doSomething AbstractEntity unknownEntity = ny NullEntity (); ukendt Entitet . gøre Noget (); // ingen output } } abstrakt klasse _ _ offentlig abstrakt void doSomething (); } klasse RealEntity udvider AbstractEntity { @Tilsidesæt public void doSomething () { System . ud . println ( "RealEntity::doSomething" ); } } klasse NullEntity udvider AbstractEntity { @Tilsidesæt public void doSomething () { } }Eksempel i Python
Kildekode i Python # Mønster Nul objekt. klasse AbstractEntity : def gør Noget ( selv ): passere klasse RealEntity ( AbstractEntity ): def gør Noget ( selv ): print ( "RealEntity.doSomething" ) klasse NullEntity ( AbstractEntity ): def gør Noget ( selv ): passere def main (): real_entity = RealEntity () real_entity . gøre noget () unknown_entity = NullEntity () ukendt_enhed . gøre noget () hvis __navn__ == "__main__" : vigtigste ()Design mønstre | |
---|---|
Hoved | |
Generativ | |
Strukturel | |
Adfærdsmæssigt | |
Parallel programmering |
|
arkitektonisk |
|
Java EE skabeloner | |
Andre skabeloner | |
Bøger | |
Personligheder |