1

本文来自现实场景
场景:
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();

yaoran
17 声望1 粉丝

喜欢代码,热爱生活,喜欢运动,平常爱看各种书籍,