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