close

Vzor kontejneru

Přejít na navigaci Přejít na hledání

Container Pattern ( také nazývaný Containment Pattern) je specifický model objektově orientovaného programování , který v určitých případech umožňuje lepší správu zapouzdření . Kontejner je více než konstrukt, jako každý návrhový vzor , ​​dobrý postup při psaní chytřejšího a především bezpečného kódu. Poprvé byl definován GoF ( Gang of Four ) v knize „Design Patterns: Elements of Reusable Object Oriented Software“ .

Obsluha a použití

Navrhovaný model řeší problém "praskání" (rozbití) zapouzdření v situacích dědičnosti mezi třídami . Dědičnost je velmi silný princip objektově orientovaného programování, ale pokud je zneužita, generuje bezpečnostní ztráty. Zejména zvažte případ, kdy chcete rozšířit funkčnost třídy, která implementuje některé metody . Pokud bychom chtěli vytvořit nový objekt, který kromě implementace všech metod výchozí třídy jednu z těchto metod minimálně upraví, to znamená, že by chtěl k základnímu algoritmu přidat nějaké předchozí nebo následné kroky , obvyklá praxe by být odvození z nadřazené třídy nové třídy, deklarování metody základní třídy jako virtuální a přepsání metody ( Override ) v nové. To však rozhodně není správný způsob, jak tento problém vyřešit, protože ponechává svobodu komukoli, kdo použije nadřazenou třídu, aby virtuální metodu bez rozdílu přepsal. Situaci neřeší ani uchýlení se ke skrývání s použitím klíčového slova new , ve skutečnosti by již nebyly respektovány dobré zásady dědičnosti. Pak přichází odpověď z Container Pattern, který spočívá ve vytvoření nové třídy, do které bude jako pole třídy přiřazen objekt naší výchozí třídy a následně nově vytvořená třída implementuje metodu, do které vložíme nové kroky algoritmu, navíc k volání základního algoritmu prostřednictvím instance nadřazené třídy. Pro větší jasnost se podívejte na navrhovaný příklad.

Příklad

V navrhovaném příkladu napsaném v C # chceme rozšířit metodu drinkSomething třídy Guy. Řešení s využitím odvozené třídy je uvedeno níže.

class  Guy 
    { 
        // Pole třídy a konstruktor 
        // ... 
        // Metoda deklarovaná jako virtuální 
        veřejný  virtuální  void  drinkSomething () 
        { // 
            Základní algoritmus 
            konzoly . WriteLine ( "Moc se mi to líbí! Děkuji!" ); 
        } 
        // ... 
    } 
    // Obvyklá praxe: dědičnost 
    // Odvozeno z třídy Guy 
class  Gentleman  :  Guy 
    { 
        // Volání konstruktoru (základna) 
        // ... 
        public  override  void  drinkSomething () 
        { 
            // volání metody rodičovské třídy 
            // základního 
            základního algoritmu . pít Něco (); 
            // přidána 
            konzole . WriteLine ( "Chcete nějaké?" ); 
        } 
        // ... 
    }

Toto je místo toho řešení problému s použitím vzoru kontejneru. Rozumí se, že metoda drinkSomething již není deklarována jako virtuální.

class  Gentleman 
    { 
        // Volání konstruktoru (základna) 
        // Pole třídy Gentleman: 
        // instance třídy Guy 
        Guy  johnny  =  new  Guy (); 
        // ... 
        public  void  drinkSomething () 
        { 
            // volání metody rodičovské třídy // 
            johnnyho základního algoritmu 
            . pít Něco (); // přidána konzole . WriteLine ( "Chcete nějaké?" ); } // ... }
            
            
        
        
    

Externí odkazy

Inversion of Control Containers and the Dependency Injection pattern od Martina Fowlera , který představuje vzor kontroly inverze a řešení pomocí kontejnerů