本文來自現實場景
場景:
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();