建造模式 + 外观模式示例:实现扣除用户金币及写入用户明细
实现功能:
扣除用户金币及写入金币明细,这是同一个行为,使用外观模式
金币明细需要多个参数来保证对象的完整,参数过多,所以使用建造模式
一.用户明细类
class MoneyDetail
{
const MONEY_PAY = 1; // 充值获得
const MONEY_EXCHANGE = 2; // 兑换
private $type;
private $quantity;
private $desc;
private $time;
public function __construct(MoneyDetailBuilder $builder)
{
$this->type = $builder->getType();
$this->quantity = $builder->getQuantity();
$this->desc = $builder->getDesc();
$this->time = $builder->getTime();
}
/**
* 写入数据库
*/
public function writeDb()
{
echo "[{$this->type}|{$this->quantity}|{$this->desc}|{$this->time}]数据已写入数据库";
}
}
二.用户明细建造者类
class MoneyDetailBuilder
{
private $type;
private $quantity;
private $desc;
private $time;
/**
* @return mixed
*/
public function getType()
{
return $this->type;
}
/**
* @param $type
* @return $this
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* @return mixed
*/
public function getQuantity()
{
return $this->quantity;
}
/**
* @param $quantity
* @return $this
*/
public function setQuantity($quantity)
{
$this->quantity = $quantity;
return $this;
}
/**
* @return mixed
*/
public function getDesc()
{
return $this->desc;
}
/**
* @param $desc
* @return $this
*/
public function setDesc($desc)
{
$this->desc = $desc;
return $this;
}
/**
* @return mixed
*/
public function getTime()
{
return $this->time;
}
/**
* @param $time
* @return $this
*/
public function setTime($time)
{
$this->time = $time;
return $this;
}
public function moneyDetail()
{
return new MoneyDetail($this);
}
}
三.用户类:
class User
{
private $money;
public function __construct()
{
$this->money = 500;
}
public function reduceMoney($quantity)
{
$this->money -= $quantity;
echo '用户扣除金币成功';
}
public function getMoney()
{
return $this->money;
}
}
四.扣除用户金币外观类
class UserFacade
{
private $user;
private $moneyDetailBuilder;
public function __construct(User $user, MoneyDetailBuilder $moneyDetailBuilder)
{
$this->user = $user;
$this->moneyDetailBuilder = $moneyDetailBuilder;
}
public function reduceMoney($quantity)
{
$this->user->reduceMoney($quantity);
$this->moneyDetailBuilder->setDesc($this->moneyDetailBuilder->getDesc() . "扣除{$quantity}金币;当前金币{$this->user->getMoney()}");
$this->moneyDetailBuilder->moneyDetail()->writeDb();
}
}
五.调用
// 建造金币明细类
$moneyDetailBuilder = new MoneyDetailBuilder();
$moneyDetailBuilder->setType(MoneyDetail::MONEY_EXCHANGE)
->setQuantity(100)
->setTime(time())
->setDesc('兑换奖品,');
// 扣除金币
$user = new User();
$userFacade = new UserFacade($user, $moneyDetailBuilder);
$userFacade->reduceMoney(100);
浙公网安备 33010602011771号