课程名称 :大话PHP设计模式
课程章节:策略模式
讲师:Rango
课程内容:
策略模式:
1、策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式
2、实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类名,并且所有广告位展示不同的广告,传统的做法是加入if...else... 判断。
如果新增加一种用户类型,只需要新增加一种策略即可
UserStrategy.php策略的接口文件:约定策略的所有行为。
FemaleUserStrategy.php 实现接口的所有方法
MaleUserStrategy.php
调用:
class Page
{
protected $strategy;
function index()
{
echo "AD:";
$this->strategy->showAd();
echo "<br/>";
echo "Category:";
$this->strategy->showCategory();
echo "<br/>";
}
function setStrategy(\IMooc\UserStrategy $strategy)
{
$this->strategy=$strategy;
}
}
$page=new Page();
if(isset($_GET["female"]))
{
$strategy=new \IMooc\FemaleUserStrategy();
}
else{
$strategy=new \IMooc\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();
本案例中index.php中的Page类即使用策略的环境,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
UserStrategey即抽象策略类,它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。
FemaleUserStrategy和MaleUserStrategy是具体的策略类,它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
课程收获:
策略模式除了实现分支逻辑的处理之外,还可以实现Ioc,依赖倒置,控制反转
面向对象很重要的一个思想是解耦。