Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist das Dekoratormuster und wie unterscheidet es sich vom Brückenmuster?

Was ist das Dekoratormuster und wie unterscheidet es sich vom Brückenmuster?

齐天大圣
齐天大圣Original
2020-08-05 08:57:482762Durchsuche

Die Geschichte von Ramen

Ramen-Restaurants verkaufen Ramen in kleine Schüsseln und große Schüsseln. Eine kleine Schüssel kostet 6 Yuan Eine große Schüssel kostet 6 Yuan. Wenn Sie außerdem Rindfleisch hinzufügen, müssen Sie 6 Yuan, ein Ei 1 Yuan, ein großes Steak 5 Yuan und ein Stück knusprigen Reis 1 Yuan hinzufügen. Wenn Sie die traditionelle Schreibmethode verwenden, um Ramen-Nudeln mit unterschiedlichen Preisen festzulegen, müssen Sie 8 Kategorien schreiben (Anzahl der Ramen-Portionen * Anzahl der Beilagen). Wenn der Nudelladen nun eine neue Portionsgröße einführt – mittlere Schüssel, dann müssen 4 neue Kategorien hinzugefügt werden. Dies führt zu einem Problem – einer Klassenexplosion.

Wenn Sie meinen vorherigen Artikel gelesen habenhttps://www.php.cn/php-weizijiaocheng-457250.html, nachdem Sie den Bridge-Modus verstanden haben, werden Sie das Gefühl haben, dass dieses Problem auftreten kann gelöst werden Bridge-Modus zu lösen. Teilen Sie es in zwei große Kategorien ein: Nudeln und Beilagen.

Im Folgenden verwenden wir den Bridge-Modus, um das obige Problem zu lösen. Der Code lautet wie folgt:

interface INoodle
{
    function cost ();
    function desc ();
}

class BigNoodle implements INoodle
{
    private $cost = 9.0;
    private $dish = null;
    
    public function __construct(IDish $dish)
    {
        $this->dish = $dish;
    }
    
    public function cost()
    {
        return $this->cost + $this->dish->cost();
    }
    
    public function desc()
    {
        return $this->dish->desc() . '大碗拉面';
    }
}

class SmallNoodle implements INoodle
{
    private $cost = 6.0;
    private $dish = null;
    
    public function __construct(IDish $dish)
    {
        $this->dish = $dish;
    }
    
    public function cost()
    {
        return $this->cost + $this->dish->cost();
    }
    
    public function desc()
    {
        return $this->dish->desc() . '小碗拉面';
    }
}

interface IDish
{
    function cost ();
    function desc ();
}

class Beef implements IDish
{
    public function cost ()
    {
        return 6;
    }
    
    public function desc()
    {
        return '牛肉';
    }
}

class Crust implements IDish
{
    public function cost ()
    {
        return 1;
    }
    
    public function desc()
    {
        return '锅巴';
    }
}

class Egg implements IDish
{
    public function cost ()
    {
        return 1;
    }
    
    public function desc()
    {
        return '鸡蛋';
    }
}

Decorator-Modus

Verwenden Sie den Bridge-Modus. Es löst zwar das Quasi-Explosionsproblem, aber Sie wissen auch, dass wir beim Essen von Nudeln manchmal keine Beilagen, sondern nur Nudeln brauchen, oder wir brauchen mehrere Beilagen. Ich möchte zum Beispiel eine große Schüssel mit Rindfleisch-Ramen und 3 Stück knusprige Reisnudeln und 2 Eier hinzufügen. Für diese Anforderung kann der Bridge-Modus nicht verwendet werden. Um dieses Problem zu lösen, können wir ein anderes strukturelles Designmuster verwenden – das Dekoratormuster.

Das Decorator-Muster ist ein strukturelles Entwurfsmuster, das es Ihnen ermöglicht, neue Verhaltensweisen an das ursprüngliche Objekt zu binden, indem Sie das Objekt in einem speziellen gekapselten Objekt platzieren, das das Verhalten enthält.

Um das Dekorationsmuster zu verstehen, können Sie sich eine Puppe-Matroschka-Puppe vorstellen

Was ist das Dekoratormuster und wie unterscheidet es sich vom Brückenmuster?

Jeder Puppensatz entspricht dem Hinzufügen eines Puppen-Dekorationsobjekts . Zur Laufzeit wird das äußerste dekorative Objekt (nehmen Sie die äußere Schicht) ausgeführt und dann Schicht für Schicht ausgeführt. Möglicherweise verstehen Sie jetzt nicht, was es bedeutet, aber Sie verstehen es vielleicht, wenn Sie diesen Satz noch einmal lesen, nachdem Sie den folgenden Inhalt gelesen haben.

Ich habe selbst ein UML-Klassendiagramm gezeichnet. Es ist etwas hässlich. Klicken Sie einfach auf den Code, um ihn zu implementieren. &@

abstract class Noodles
{
    abstract function cost ();
    abstract function desc ();
}

class BigNoodle extends Noodles
{
    private $cost = 9.0;
    
    public function cost()
    {
        return $this->cost;
    }
    
    public function desc()
    {
        return '大碗拉面';
    }
}

class SmallNoodle extends Noodles
{
    private $cost = 6.0;
    
    public function cost()
    {
        return $this->cost;
    }
    
    public function desc()
    {
        return  '小碗拉面';
    }
}

abstract class NoodlesDecorator extends Noodles
{
}

class Beef extends NoodlesDecorator
{
    private $desc = '牛肉';
    private $cost = 6.0;
    protected $noodles = null;
    
    public function __construct(Noodles $noodels)
    {
        $this->noodles = $noodels;
    }
    
    public function cost ()
    {
        return $this->cost + $this->noodles->cost();
    }
    
    public function desc ()
    {
        return $this->desc . $this->noodles->desc();
    }
}

// egg、curst类代码省略,除了属性值不一样基本和Beef一致
Was ist das Dekoratormuster und wie unterscheidet es sich vom Brückenmuster?Der Testcode lautet wie folgt

$noodles = new BigNoodle();
$beefBigNoodles = new Beef($noodles);
$eggBeffBigNoodles = new Egg($beefBigNoodles);

echo $eggBeffBigNoodles->desc();
echo $eggBeffBigNoodles->cost() . '元';

Die Ergebnisausgabe: Eine große Schüssel mit Ei und Rindfleisch-Ramen 16 YuanZusammenfassung

Denken Sie über eine Frage nach: Warum wird die Menge an Ramen hier nicht als Dekorationsobjekt verwendet? Denken Sie darüber nach: Würden Sie eine große Schüssel und eine kleine Schüssel Ramen bestellen?

Decorator Pattern Features

Der Decorator und das dekorierte Objekt haben den gleichen Supertyp

Ein Objekt kann mit einem oder mehreren Dekoratoren umhüllt werden

  • Das Objekt kann jederzeit dekoriert werden, sodass Sie Ihre bevorzugten Dekoratoren zur Laufzeit dynamisch und unbegrenzt zum Dekorieren von Objekten verwenden können.

Das obige ist der detaillierte Inhalt vonWas ist das Dekoratormuster und wie unterscheidet es sich vom Brückenmuster?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn