mirror of
https://github.com/DesignPatternsPHP/DesignPatternsPHP.git
synced 2025-07-12 19:06:24 +02:00
add pattern Interpreter
This commit is contained in:
Behavioral/Interpreter
8
Behavioral/Interpreter/AbstractExp.php
Normal file
8
Behavioral/Interpreter/AbstractExp.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter;
|
||||
|
||||
abstract class AbstractExp
|
||||
{
|
||||
abstract public function interpret(Context $context): bool;
|
||||
}
|
20
Behavioral/Interpreter/AndExp.php
Normal file
20
Behavioral/Interpreter/AndExp.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter;
|
||||
|
||||
class AndExp extends AbstractExp
|
||||
{
|
||||
private AbstractExp $first;
|
||||
private AbstractExp $second;
|
||||
|
||||
public function __construct(AbstractExp $first, AbstractExp $second)
|
||||
{
|
||||
$this->first = $first;
|
||||
$this->second = $second;
|
||||
}
|
||||
|
||||
public function interpret(Context $context): bool
|
||||
{
|
||||
return (bool) $this->first->interpret($context) && $this->second->interpret($context);
|
||||
}
|
||||
}
|
24
Behavioral/Interpreter/Context.php
Normal file
24
Behavioral/Interpreter/Context.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter;
|
||||
|
||||
use Exception;
|
||||
|
||||
class Context
|
||||
{
|
||||
private array $poolVariable;
|
||||
|
||||
public function lookUp(string $name): bool
|
||||
{
|
||||
if (!key_exists($name, $this->poolVariable)) {
|
||||
throw new Exception("no exist variable: $name");
|
||||
}
|
||||
|
||||
return $this->poolVariable[$name];
|
||||
}
|
||||
|
||||
public function assign(VariableExp $variable, bool $val)
|
||||
{
|
||||
$this->poolVariable[$variable->getName()] = $val;
|
||||
}
|
||||
}
|
20
Behavioral/Interpreter/OrExp.php
Normal file
20
Behavioral/Interpreter/OrExp.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter;
|
||||
|
||||
class OrExp extends AbstractExp
|
||||
{
|
||||
private AbstractExp $first;
|
||||
private AbstractExp $second;
|
||||
|
||||
public function __construct(AbstractExp $first, AbstractExp $second)
|
||||
{
|
||||
$this->first = $first;
|
||||
$this->second = $second;
|
||||
}
|
||||
|
||||
public function interpret(Context $context): bool
|
||||
{
|
||||
return $this->first->interpret($context) || $this->second->interpret($context);
|
||||
}
|
||||
}
|
63
Behavioral/Interpreter/Tests/InterpreterTest.php
Normal file
63
Behavioral/Interpreter/Tests/InterpreterTest.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter\Tests;
|
||||
|
||||
use DesignPatterns\Behavioral\Interpreter\AndExp;
|
||||
use DesignPatterns\Behavioral\Interpreter\Context;
|
||||
use DesignPatterns\Behavioral\Interpreter\OrExp;
|
||||
use DesignPatterns\Behavioral\Interpreter\VariableExp;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class InterpreterTest extends TestCase
|
||||
{
|
||||
private Context $context;
|
||||
private VariableExp $a;
|
||||
private VariableExp $b;
|
||||
private VariableExp $c;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
$this->context = new Context();
|
||||
$this->a = new VariableExp('A');
|
||||
$this->b = new VariableExp('B');
|
||||
$this->c = new VariableExp('C');
|
||||
}
|
||||
|
||||
public function testOr()
|
||||
{
|
||||
$this->context->assign($this->a, false);
|
||||
$this->context->assign($this->b, false);
|
||||
$this->context->assign($this->c, true);
|
||||
|
||||
// A ∨ B
|
||||
$exp1 = new OrExp($this->a, $this->b);
|
||||
$result1 = $exp1->interpret($this->context);
|
||||
|
||||
$this->assertFalse($result1, 'A ∨ B must false');
|
||||
|
||||
// $exp1 ∨ C
|
||||
$exp2 = new OrExp($exp1, $this->c);
|
||||
$result2 = $exp2->interpret($this->context);
|
||||
|
||||
$this->assertTrue($result2, '(A ∨ B) ∨ C must true');
|
||||
}
|
||||
|
||||
public function testAnd()
|
||||
{
|
||||
$this->context->assign($this->a, true);
|
||||
$this->context->assign($this->b, true);
|
||||
$this->context->assign($this->c, false);
|
||||
|
||||
// A ∧ B
|
||||
$exp1 = new AndExp($this->a, $this->b);
|
||||
$result1 = $exp1->interpret($this->context);
|
||||
|
||||
$this->assertTrue($result1, 'A ∧ B must true');
|
||||
|
||||
// $exp1 ∧ C
|
||||
$exp2 = new AndExp($exp1, $this->c);
|
||||
$result2 = $exp2->interpret($this->context);
|
||||
|
||||
$this->assertFalse($result2, '(A ∧ B) ∧ C must false');
|
||||
}
|
||||
}
|
23
Behavioral/Interpreter/VariableExp.php
Normal file
23
Behavioral/Interpreter/VariableExp.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace DesignPatterns\Behavioral\Interpreter;
|
||||
|
||||
class VariableExp extends AbstractExp
|
||||
{
|
||||
private string $name;
|
||||
|
||||
public function __construct(string $name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function interpret(Context $context): bool
|
||||
{
|
||||
return $context->lookUp($this->name);
|
||||
}
|
||||
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
}
|
BIN
Behavioral/Interpreter/uml/uml.png
Normal file
BIN
Behavioral/Interpreter/uml/uml.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 22 KiB |
Reference in New Issue
Block a user