>백엔드 개발 >PHP 튜토리얼 >PHP 디자인 패턴의 인터프리터 패턴에 대한 심층 분석

PHP 디자인 패턴의 인터프리터 패턴에 대한 심층 분석

怪我咯
怪我咯원래의
2017-07-09 09:34:391492검색

이 글은 PHPDesign PatternInterpreter 패턴에 대한 자세한 분석 및 소개입니다. 필요한 친구는 Composite 클래스 계층 구조의 문법이 포함된

Interpreter(Interpreter) 패턴을 참조할 수 있습니다. 규칙은 클래스에 매핑되고, 문법에 따른 표현식은 복합 패턴의 인스턴스 객체 그래프 외에는 아무것도 없는 추상 구문 트리로 변환될 수 있습니다.

Tree는 추상 명사입니다. 실제로 대부분의 경우 문자열이 있거나 데이터 구조의 구체적인 표현식이 있을 수 있다는 점을 무시하는 표현식의 추상 표현이기 때문입니다(예: , PHP에서 "A"와 "x41"은 동일한 추상 리터럴 값의 서로 다른 구체적인 표현입니다. 결과는 논리적 규칙을 통해 분리되어 해석 과정을 크게 단순화합니다.

Interpreter는 그다지 일반적인 패턴은 아니지만 간단한 문법의 경우 클래스를 추가하는 것처럼 규칙을 추가하는 것은 쉽지만 Others로 인해 발생하는 구체적인 표현에서 추상 구문 트리로의 변환을 해결하지 못합니다. 서비스가 완료되었습니다.

인터프리터 패턴은 간단한 AbstractExpression 메서드(인터프리터 작업) 구현을 위해 복합 계층 구조를 활용하도록 설계되었습니다. 인터프리터 작업의 매개 변수는 일반적으로 주어진 메서드의 경우 총체적으로 컨텍스트라고 합니다. 또는 일부 작업에는 존재하지 않을 수도 있습니다.

또한 통역사가 포함되면 복합 패턴의 리프 및 컨테이너 참여자 이름이 달라지며 이러한 이름은 터미널 또는 비터미널 표현과 같은 역할을 반영합니다.

참여자:
◆클라이언트: explain 작업을 사용하세요.
◆추상 표현: 표현 트리를 기반으로 한 추상입니다.
◆NonTerminalExpression: 다른 추상 표현식(AbstractExpression 인스턴스)을 재귀적으로 포함하는 표현식입니다.
◆단말 표현: 더 이상 단순화할 수 없는 표현입니다.


책 "Design Patterns"에서는 이 패턴에 대한 확장된 예제를 제공합니다. 부울 표현식을 수학 표현식으로 대체하여 리모델링했기 때문에 이 예제에서는 수학 표현식의 표시를 해결하고 해당 평가( )를 다른 패턴으로 분리합니다. ConcreteExpression 클래스.

코드는 다음과 같습니다:

/**  
 * 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...

위 내용은 PHP 디자인 패턴의 인터프리터 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.