Nullobjekt (designmönster)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 16 september 2017; kontroller kräver 15 redigeringar .

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]

Beskrivning

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:

Struktur

I ett klassdiagram i UML representeras ett designmönster enligt följande:

Exempel

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

Ruby exempel

Ruby källkod modul NullObject #AbstractEntity klass AbstractEntity def gör något höj NoMethodError . ny slutet slutet #RealEntity klass RealEntity < AbstractEntity def gör något sätter "RealEntity > Gör något" slutet slutet # NullEntity class NullEntity < AbstractEntity def gör något noll slutet slutet slutet #Klient modul Klient inkluderar NullObject realEntity = RealEntity . ny nullEntity = NullEntity . ny sätter "RealEntity:" # => RealEntity realEntity . doSomething # => RealEntity > DoSomething sätter "NullEntity:" # => NullEntity: nullEntity . doNågot #inte utmatas slutet

Anteckningar

  1. Woolf, Bobby. Pattern Languages ​​of Program Design 3  (neopr.) / Martin, Robert; Riehle, Dirk; Buschmann, Frank. — Addison-Wesley , 1998.
  2. http://sourcemaking.com/design_patterns/null_object Arkiverad 15 juni 2012 på Wayback Machine SourceMaking Tutorial

Länkar