În programarea orientată pe obiecte, un obiect nul este un obiect cu un anumit comportament neutru ("null"). Modelul de proiectare Null Object descrie utilizarea unor astfel de obiecte și comportamentul lor (sau lipsa acestora). Publicat pentru prima dată în seria de cărți Pattern Languages of Program Design . [unu]
În limbaje orientate pe obiecte, cum ar fi Java sau C# , obiectele pot fi NULL . Referințele la astfel de obiecte trebuie verificate pentru null înainte de a fi utilizate, deoarece metodele clasei unui obiect „null” în general nu pot fi apelate.
Scopul unui obiect nul este să încapsuleze absența unui obiect prin înlocuirea acestuia cu un alt obiect care nu face nimic.
Acest model de design este recomandat atunci când:
Într -o diagramă de clasă în UML , un model de design este reprezentat după cum urmează:
Exemplu în C#
Text sursă în C# /* * Un exemplu de utilizare a modelului Null Object: */ voidMain ( ) { AbstractEntity realEntity = new RealEntity (); realEntity . face ceva (); // RealEntity::do Something AbstractEntity unknownEntity = new NullEntity (); Entitate necunoscută . face ceva (); // nicio ieșire } // Definiți aici alte metode și clase clasă abstractă publică AbstractEntity { public abstract void doSomething (); } clasă publică RealEntity : AbstractEntity { public override void do Something () { Consola . WriteLine ( "RealEntity::doSomething" ); } } clasă publică NullEntity : AbstractEntity { public override void do Something () { // facand nimic } }Exemplu în PHP
Cod sursă PHP /* * Un exemplu de utilizare a modelului Null Object: */ declara ( strict_types = 1 ); namespace DesignPatterns \ Behavioral \ NullObject ; clasa de serviciu { funcția publică __construct ( logger privat $ logger ) { } /** * Fă ceva ... */ funcție publică face ceva () { // observați aici că nu trebuie să verificați dacă logger-ul este setat cu de ex. is_null(), folosește-l în schimb $ this -> logger -> log ( ' Suntem în ' . __METODA__ ) ; } } /** * Caracteristică cheie: NullLogger trebuie să moștenească de la această interfață ca orice alt logger */ interfață Logger { jurnalul funcțiilor publice ( șir $ str ); } clasa PrintLogger implementează Logger { jurnalul funcțiilor publice ( șir $ str ) { echo $ str ; } } clasa NullLogger implementează Logger { jurnalul funcțiilor publice ( șir $ str ) { // nu face nimic } } $ servicePrint = serviciu nou ( nou PrintLogger ()); $ servicePrint -> doSomething (); // „Suntem în DesignPatterns\Behavioral\NullObject\Service::doSomething” $ serviceNull = serviciu nou ( nullLogger nou ()); $ serviceNull -> doSomething (); // (nu face nimic)Exemplu Java
Sursa Java /* * Pattern Null obiect. */ clasă publică principală { public static void main ( String [] args ) { AbstractEntity realEntity = new RealEntity (); realEntity . face ceva (); // RealEntity::do Something AbstractEntity unknownEntity = new NullEntity (); Entitate necunoscută . face ceva (); // nicio ieșire } } clasa abstracta _ _ public abstract void doSomething (); } clasa RealEntity extinde AbstractEntity { @Trece peste public void face Something () { Sistem . afară . println ( "RealEntity::doSomething" ); } } clasa NullEntity extinde AbstractEntity { @Trece peste public void face Something () { } }Exemplu în Python
Cod sursă în Python # Pattern Obiect nul. clasa AbstractEntity : def face Something ( self ): trece clasa RealEntity ( AbstractEntity ): def face Something ( self ): print ( „RealEntity.do Something” ) clasa NullEntity ( AbstractEntity ): def face Something ( self ): trece def main (): real_entity = RealEntity () entitate_reala . face ceva () unknown_entity = NullEntity () entitate_necunoscută . face ceva () if __name__ == "__main__" : principal ()Modele de design | |
---|---|
Principal | |
Generativ | |
Structural | |
Comportamental | |
Programare în paralel |
|
arhitectural |
|
Șabloane Java EE | |
Alte șabloane | |
Cărți | |
Personalități |