实现功能:
用户抽奖消耗相应银两,将银两明细写入数据库,(为示例简单,体现模式意图,我们假定用户抽奖一定会中奖),将抽中的银两增加给用户也写入数据库
一.银两类:
class Silver
{
const RULE_ADD = 1;
const RULE_REDUCE = 2;
private $uid;
private $type;
private $rule;
private $quantity;
private $desc;
private $time;
public function __construct($uid,$type, $rule, $quantity, $desc, $time)
{
$this->uid = $uid;
$this->type = $type;
$this->rule = $rule;
$this->quantity = $quantity;
$this->desc = $desc;
$this->time = time();
}
/**
* @param mixed $quantity
*/
public function setQuantity($quantity)
{
$this->quantity = $quantity;
}
/**
* @param mixed $desc
*/
public function setDesc($desc)
{
$this->desc = $desc;
}
/**
* @param mixed $rule
*/
public function setRule($rule)
{
$this->rule = $rule;
}
public function writeToDb()
{
// 模拟写入数据库
echo "{$this->uid}|{$this->type}|{$this->rule}|{$this->quantity}|{$this->desc}|{$this->time}已写入数据库<br>";
return true;
}
}
二.抽奖类
class Lottery
{
const SILVER_TYPE = 1;
const SILVER_ADD_QUANTITY = 20;
const SILVER_REDUCE_QUANTITY = 10;
private $uid;
private $silver;
public function __construct($uid)
{
$this->uid = $uid;
}
// 抽奖
public function run()
{
// 处理其他逻辑....
/**
* 将扣除用户的银两写入记录
*/
$this->silver = new Silver(
$this->uid,
self::SILVER_TYPE,
Silver::RULE_REDUCE,
self::SILVER_REDUCE_QUANTITY,
'抽奖扣除银两',
time()
);
// 处理其他逻辑....
/**
* 使用原型模式,直接clone一个银两类
* 将用户抽奖获得的银两写入记录
*/
$addSilver = clone $this->silver;
$addSilver->setRule(Silver::RULE_ADD);
$addSilver->setQuantity(self::SILVER_ADD_QUANTITY);
$addSilver->setDesc('抽奖中奖');
if ($this->silver->writeToDb() && $addSilver->writeToDb()) {
echo '<hr>抽奖成功!';
}
}
}
三.调用
$lottery = new Lottery(10);
$lottery->run();