本文来自现实场景
场景:
M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:
(1)学生凭学生证可享受票价8折优惠;
(2)年龄在10周岁以及以下的儿童可以享受每张票减免10元的优惠(原始票价需要大于20元);
(3)影院VIP用户除享受票价八折优惠外还可以进行积分,积分累计到一定额度可以换取电影院赠送的奖品;
该系统在将来还可能会根据需求引入更多的打折方案。
策略模式包含以下3个角色:
(1)Context(环境类):负责使用算法策略,其中维持了一个抽象策略类的引用实例。
(2)Strategy(抽象策略类):所有策略类的父类,为所支持的策略算法声明了抽象方法。=> 既可以是抽象类也可以是接口
(3)ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的方法。
接口类
/**
* 折扣接口.
*/
interface IDiscount
{
public function Calculate($price);
}
/**
* 影院票
*/
class MovieTiket
{
private $_price;
private $_discount;
public function __construct($price){
$this->_price = $price;
}
//价格
public function Price(){
echo "当前票价:".$this->_price."\n";
}
//折扣策略
public function Discount(IDiscount $discount){
$this->_price = $discount->Calculate($this->_price);
}
}
/**
* 学生票策略
*/
include "IDiscount.php";
class StudentDiscount implements IDiscount
{
public function Calculate($price){
echo "学生票";
return $price * 0.8;
}
}
/**
* vip 票策略
*/
include "IDiscount.php";
class VipDiscount implements IDiscount
{
public function Calculate($price)
{
// TODO: Implement Calculate() method.
echo "vip 会员票,并增加积分";
return $price * 0.5;
}
}
/**
* 儿童票策略
*/
class ChildrenDiscount implements IDiscount
{
public function Calculate($price)
{
echo "儿童票";
return $price - 10;
}
}
//test
include "MovieTiket.php";
include "StudentDiscount.php";
$mk = new MovieTiket(50);
//vip 票价格
$mk->Discount(new StudentDiscount());
$mk->Price();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。