I objektorienterad programmering är ett nullobjekt ett objekt med ett visst neutralt ("null") beteende. Null Object- designmönstret beskriver användningen av sådana objekt och deras beteende (eller brist på sådana). Först publicerad i bokserien Pattern Languages of Program Design . [ett]
I objektorienterade språk som Java eller C# kan objekt vara NULL . Referenser till sådana objekt måste kontrolleras för null innan de används, eftersom metoderna för klassen för ett "null"-objekt i allmänhet inte kan anropas.
Syftet med ett Null-objekt är att kapsla in frånvaron av ett objekt genom att ersätta det med ett annat objekt som inte gör något.
Detta designmönster rekommenderas när:
I ett klassdiagram i UML representeras ett designmönster enligt följande:
Exempel i C#
Källtext i C# /* * Ett exempel på att använda mönstret Null Object: */ voidMain ( ) { AbstractEntity realEntity = ny RealEntity (); realEntity . göra något (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); okänd Entitet . göra något (); // ingen utgång } // Definiera andra metoder och klasser här offentlig abstrakt klass AbstractEntity { public abstract void doSomething (); } public class RealEntity : AbstractEntity { offentlig åsidosättande void doSomething () { Konsol . WriteLine ( "RealEntity::doSomething" ); } } public class NullEntity : AbstractEntity { offentlig åsidosättande void doSomething () { // gör inget } }Exempel i PHP
PHP källkod /* * Ett exempel på att använda mönstret Null Object: */ deklarera ( strikta_typer = 1 ); namnutrymme DesignPatterns \ Behavioral \ NullObject ; serviceklass _ { offentlig funktion __construct ( privat Logger $ logger ) { } /** * göra någonting ... */ offentlig funktion gör något () { // märk här att du inte behöver kontrollera om loggern är inställd på t.ex. is_null(), använd den istället $ this -> logger -> log ( ' Vi är i ' . __METHOD__ ); } } /** * Nyckelfunktion: NullLogger måste ärva från detta gränssnitt som alla andra loggare */ gränssnitt Logger { offentlig funktionslogg ( sträng $ str ) ; } klass PrintLogger implementerar Logger { offentlig funktionslogg ( sträng $ str ) _ { echo $ str ; } } class NullLogger implementerar Logger { offentlig funktionslogg ( sträng $ str ) _ { // göra ingenting } } $ servicePrint = ny tjänst ( ny PrintLogger ()); $ servicePrint -> doSomething (); // 'Vi är i DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = ny tjänst ( ny NullLogger ()); $ serviceNull -> doSomething (); // (göra ingenting)Java exempel
Java -källa /* * Mönster Null-objekt. */ offentlig klass Main { public static void main ( String [] args ) { AbstractEntity realEntity = ny RealEntity (); realEntity . göra något (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); okänd Entitet . göra något (); // ingen utgång } } abstrakt klass _ _ public abstract void doSomething (); } class RealEntity utökar AbstractEntity { @Åsidosätta public void doSomething () { System . ut . println ( "RealEntity::doSomething" ); } } class NullEntity utökar AbstractEntity { @Åsidosätta public void doSomething () { } }Exempel i Python
Källkod i Python # Pattern Null-objekt. klass AbstractEntity : def doSomething ( själv ): passera klass RealEntity ( AbstractEntity ): def doSomething ( själv ): print ( "RealEntity.doSomething" ) klass NullEntity ( AbstractEntity ): def doSomething ( själv ): passera def main (): real_entity = RealEntity () verklig_enhet . göra något () unknown_entity = NullEntity () unknown_entity . göra något () om __namn__ == "__main__" : huvud ()Design mönster | |
---|---|
Main | |
Generativ | |
Strukturell | |
Beteende | |
Parallell programmering |
|
arkitektonisk |
|
Java EE-mallar | |
Andra mallar | |
Böcker | |
Personligheter |