实现功能:
1.用户金币或银两达到一定数额后,可以用相应数量的金币或银两开通推广功能,开通推广功能后,由此产生的收益归该用户所有
2.推广类,不允许直接操作推广类,需要判断用户是否有金币或银两来开通,所以使用代理类.
3.用户可以用银两也可以用金币来开通,所以使用策略模式或简单工厂模式;就系统目前而言就两种开通方式,比较固化,所以使用简单工厂模式来创建开通类会比较恰当.
一.推广接口
/**
* 推广接口
* Interface PromotionInterface
*/
interface PromotionInterface
{
const LEVEL_FIRST = 1;
const LEVEL_SECOND = 2;
const LEVEL_THIRD = 3;
public function open($level);
}
二.银两开通推广类:
class PromotionSilver implements PromotionInterface
{
const EXPEND = [
PromotionInterface::LEVEL_FIRST => 1000,
PromotionInterface::LEVEL_SECOND => 2000,
PromotionInterface::LEVEL_THIRD => 3000,
];
public function open($level)
{
echo "已开通{$level}推广级别";
}
}
三.金币开通推广
/**
* 金币开通推广
* Class PromotionMoney
*/
class PromotionMoney implements PromotionInterface
{
const EXPEND = [
PromotionInterface::LEVEL_FIRST => 100,
PromotionInterface::LEVEL_SECOND => 200,
PromotionInterface::LEVEL_THIRD => 300,
];
public function open($level)
{
echo "已开通{$level}推广级别";
}
}
四.用户类
/**
* Class User
*/
class User
{
private $uid;
private $money; // 金币
private $silver; // 银两
public function __construct($uid)
{
$this->uid = $uid;
$this->money = 200;
$this->silver = 5000;
}
public function getMoney()
{
return $this->money;
}
/**
* 获得用户拥有的银两
* @return int
*/
public function getSilver()
{
return $this->silver;
}
/**
* 扣除用户金币
* @param $money
*/
public function reduceMoney($money)
{
$this->money -= $money;
}
/**
* 扣除用户银两
* @param $silver
*/
public function reduceSilver($silver)
{
$this->silver -= $silver;
}
}
五.代理类+策略模式:
/**
* Class PromotionProxy
*/
class PromotionProxy implements PromotionInterface
{
private $user;
private $promotion;
public function __construct($uid)
{
$this->user = new User($uid);
}
public function setPromotion(PromotionInterface $promotion)
{
$this->promotion = $promotion;
}
public function open($level)
{
if ($this->promotion instanceof PromotionSilver) {
$expend = PromotionSilver::EXPEND[$level];
if ($this->user->getSilver() < $expend) {
echo '银两不足';
return false;
}
// 扣除银两
$this->user->reduceSilver($expend);
}
if ($this->promotion instanceof PromotionMoney) {
$expend = PromotionMoney::EXPEND[$level];
if ($this->user->getMoney() < $expend) {
echo '金币不足';
return false;
}
// 扣除金币
$this->user->reduceMoney($expend);
}
$this->promotion->open($level);
echo $this->user->getMoney();
}
}
调用:
$client = new PromotionProxy($uid = 10);
$client->setPromotion(new PromotionMoney());
$client->open(PromotionInterface::LEVEL_FIRST);
六.代理类+简单工厂模式
/**
* Class PromotionProxy
*/
class PromotionProxy2 implements PromotionInterface
{
const OPEN_MONEY = 'money';
const OPEN_SILVER = 'silver';
private $user;
private $promotion;
public function __construct($uid, $type)
{
$this->user = new User($uid);
switch ($type) {
case self::OPEN_MONEY:
$this->promotion = new PromotionMoney();
break;
case self::OPEN_SILVER:
$this->promotion = new PromotionSilver();
break;
default:
throw new Exception('开通类别错误');
break;
}
}
/**
* @param $level
* @return bool
*/
public function open($level)
{
if ($this->promotion instanceof PromotionSilver) {
if ($this->user->getSilver() < PromotionSilver::EXPEND[$level]) {
echo '银两不足';
return false;
}
}
if ($this->promotion instanceof PromotionMoney) {
if ($this->user->getMoney() < PromotionMoney::EXPEND[$level]) {
echo '金币不足';
return false;
}
}
$this->promotion->open($level);
return true;
}
}
调用:
$client = new PromotionProxy2(10, PromotionProxy2::OPEN_SILVER);
$client->open(PromotionInterface::LEVEL_FIRST);