目的
- 實作 Facebook or PTT 的讚噓功能
紀錄
程式
Context.php
<?php
class Context
{
private $likeState;
private $fuckState;
private $nullState;
private $currentState;
public function __construct()
{
$this->likeState = new LikeState($this);
$this->fuckState = new FuckState($this);
$this->nullState = new NullState($this);
$this->currentState = $this->nullState;
}
// 觸發器
public function turnLike()
{
$this->currentState->like();
}
// 觸發器
public function turnFuck()
{
$this->currentState->fuck();
}
// 設定目前狀態
public function setState(IState $state)
{
$this->currentState = $state;
}
// 取得狀態-讚
public function getLikeState()
{
return $this->likeState;
}
// 取得狀態-幹
public function getFuckState()
{
return $this->fuckState;
}
// 取得狀態-無
public function getNullState()
{
return $this->nullState;
}
}
IState.php
<?php
interface IState
{
public function like();
public function fuck();
}
LikeState.php
<?php
class LikeState implements IState
{
private $context;
public function __construct(Context $contextNew)
{
$this->context = $contextNew;
}
public function like()
{
echo "讚 -> 無\n";
$this->context->setState($this->context->getNullState());
}
public function fuck()
{
echo "讚 -> 幹\n";
$this->context->setState($this->context->getFuckState());
}
}
FuckState.php
<?php
class FuckState implements IState
{
private $context;
public function __construct(Context $contextNew)
{
$this->context = $contextNew;
}
public function like()
{
echo "幹 -> 讚\n";
$this->context->setState($this->context->getLikeState());
}
public function fuck()
{
echo "幹 -> 無\n";
$this->context->setState($this->context->getNullState());
}
}
NullState.php
<?php
class NullState implements IState
{
private $context;
public function __construct(Context $contextNew)
{
$this->context = $contextNew;
}
public function like()
{
echo "無 -> 讚\n";
$this->context->setState($this->context->getLikeState());
}
public function fuck()
{
echo "無 -> 幹\n";
$this->context->setState($this->context->getFuckState());
}
}
實例化
$example = new Context();
$example->turnLike();
$example->turnLike();
$example->turnFuck();
$example->turnFuck();
$example->turnLike();
$example->turnFuck();
$example->turnLike();
結果
無 -> 讚
讚 -> 無
無 -> 幹
幹 -> 無
無 -> 讚
讚 -> 幹
幹 -> 讚