設計模式-策略模式-例子2

本文來自現實場景
場景:
M公司爲某電影院開發了一套影院售票系統,在該系統中須要爲不一樣類型的用戶提供不一樣的電影票打折方式,具體打折方案以下:
(1)學生憑學生證可享受票價8折優惠;
(2)年齡在10週歲以及如下的兒童能夠享受每張票減免10元的優惠(原始票價須要大於20元);
(3)影院VIP用戶除享受票價八折優惠外還能夠進行積分,積分累計到必定額度能夠換取電影院贈送的獎品;php

該系統在未來還可能會根據需求引入更多的打折方案。 
策略模式包含如下3個角色:算法

  (1)Context(環境類):負責使用算法策略,其中維持了一個抽象策略類的引用實例。
  (2)Strategy(抽象策略類):全部策略類的父類,爲所支持的策略算法聲明瞭抽象方法。=> 既能夠是抽象類也能夠是接口
  (3)ConcreteStrategy(具體策略類):實現了在抽象策略類中聲明的方法。

接口類this

/**
 * 折扣接口.
 */
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();
相關文章
相關標籤/搜索