Heim  >  Artikel  >  Backend-Entwicklung  >  Eine eingehende Analyse des Interpretermusters von PHP-Entwurfsmustern

Eine eingehende Analyse des Interpretermusters von PHP-Entwurfsmustern

怪我咯
怪我咯Original
2017-07-09 09:34:391445Durchsuche

Dieser Artikel ist eine detaillierte Analyse und Einführung in den Interpreter-Modus in PHPDesignmuster Freunde, die es benötigen, können sich auf das

Interpreter-Muster beziehen. die aus einer Darstellung einer Grammatik mit einer zusammengesetzten Klassenhierarchie besteht. Die -Ausdrücke können in einen abstrakten Syntaxbaum umgewandelt werden, mit Ausnahme von Instanzen des zusammengesetzten Musters nichts anderes als der Objektgraph.

Baum ist ein abstraktes Substantiv, da es sich tatsächlich meistens um eine abstrakte Darstellung eines Ausdrucks handelt, die ignoriert, dass möglicherweise eine Zeichenfolge oder eine Datenstruktur vorhanden ist. Konkrete Ausdrücke, ( In PHP sind beispielsweise „A“ und „x41“ unterschiedliche konkrete Darstellungen desselben abstrakten Literalwerts.) Entkoppeln Sie die Ergebnisse durch logische Regeln, was den Interpretationsprozess erheblich vereinfacht.

Interpreter ist kein sehr verbreitetes Muster, aber für einfache Grammatiken ist das Hinzufügen einer Regel genauso einfach wie das Hinzufügen einer Klasse, löst jedoch nicht die Konvertierung von einer konkreten Darstellung in einen abstrakten Syntaxbaum, was abgeschlossen ist durch andere Dienstleistungen.

Das Interpretermuster dient dazu, eine zusammengesetzte hierarchische Struktur für eine einfache AbstractExpression-Methode (Interpreteroperation) zu nutzen. Die Parameter der Interpreteroperation werden normalerweise zusammenfassend als Kontext einer Methode bezeichnet. Sie werden häufig durch berechnete Werte ersetzt oder sind für einige Vorgänge möglicherweise nicht vorhanden.

Wenn ein Interpreter enthalten ist, haben die Blatt- und Containerteilnehmer des zusammengesetzten Musters in ähnlicher Weise unterschiedliche Namen, was ihre Rolle widerspiegelt: terminaler oder nicht terminaler (nicht terminaler) Ausdruck.

Teilnehmer:
◆Kunde: Erklärungsoperation verwenden.
◆Abstrakter Ausdruck: Zusammenfassung basierend auf einem Ausdrucksbaum.
◆NonTerminalExpression: Ein Ausdruck, der rekursiv andere abstrakte Ausdrücke enthält (AbstractExpression-Instanzen).
◆Terminalausdruck: Ein Ausdruck, der nicht weiter vereinfacht werden kann.


Das Buch „Design Patterns“ bietet ein erweitertes Beispiel für dieses Muster. Ich habe es umgestaltet, indem ich den booleschen Ausdruck durch einen mathematischen Ausdruck ersetzt habe, sodass dieses Beispiel einen mathematischen Ausdruck löst evaluieren() ist in eine andere ConcreteExpression-Klasse unterteilt.

Der Code lautet wie folgt:

/**  
 * AbstractExpression. All implementations of this interface  
 * are ConcreteExpressions.  
 */ 
interface MathExpression  
{  
    /**  
     * Calculates the value assumed by the expression.  
     * Note that $values is passed to all expression but it  
     * is used by Variable only. This is required to abstract  
     * away the tree structure.  
     */ 
    public function evaluate(array $values);  
}  

/**  
 * A terminal expression which is a literal value.  
 */ 
class Literal implements MathExpression  
{  
    private $_value;  

    public function construct($value)  
    {  
        $this->_value = $value;  
    }  

    public function evaluate(array $values)  
    {  
        return $this->_value;  
    }  
}  

/**  
 * A terminal expression which represents a variable.  
 */ 
class Variable implements MathExpression  
{  
    private $_letter;  

    public function construct($letter)  
    {  
        $this->_letter = $letter;  
    }  

    public function evaluate(array $values)  
    {  
        return $values[$this->_letter];  
    }  
}  

/**  
 * Nonterminal expression.  
 */ 
class Sum implements MathExpression  
{  
    private $_a;  
    private $_b;  

    public function construct(MathExpression $a, MathExpression $b)  
    {  
        $this->_a = $a;  
        $this->_b = $b;  
    }  

    public function evaluate(array $values)  
    {  
        return $this->_a->evaluate($values) + $this->_b->evaluate($values);  
    }  
}  

/**  
 * Nonterminal expression.  
 */ 
class Product implements MathExpression  
{  
    private $_a;  
    private $_b;  

    public function construct(MathExpression $a, MathExpression $b)  
    {  
        $this->_a = $a;  
        $this->_b = $b;  
    }  

    public function evaluate(array $values)  
    {  
        return $this->_a->evaluate($values) * $this->_b->evaluate($values);  
    }  
}  

// 10(a + 3)  
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3)));  
echo $expression->evaluate(array('a' => 4)), "\n";  
// adding new rules to the grammar is easy:  
// e.g. Power, Subtraction...  
// thanks to the Composite, manipulation is even simpler:  
// we could add substitute($letter, MathExpression $expr)  
// to the interface...

Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Interpretermusters von PHP-Entwurfsmustern. 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