PHP策略模式
下一篇: PHP数据对象映射模式
什么是PHP策略模式?策略模式,就是将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。
实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。那么按传统的思路方法,我们一般可以选择两种方法。第一种方法是可以将这些针对男性、女性的查询方法写到一个类中,在该类中提供相对应的方法,每一个方法对应一个具体的查询方式。第二种方法是将这些查询封装在一个统一的方法中,通过if…else等条件判断来实现。上面陈述的这两种实现方法我们都可以称之为硬编码,这两种实现方法的坏处是当要新加另一种查询方法时,代码将越变越复杂,改动的地方比较多,维护较为困难。
根据上面的案例,下面用代码说明下策略模式的具体实现和使用。
首先,声明一个策略的接口文件,这个文件约定了策略有哪些行为(方法),如:
interface UserStrategy { function showAd(); function showCategory(); }
下面定义具体的策略实现,定义一个女性行为策略:
class FemaleUserStrategy implements UserStrategy { function showAd() { echo "爆款女装"; } function showCategory() { echo "女装"; } }
下面再创建一个针对男性的策略:
class MaleUserStrategy implements UserStrategy { function showAd() { echo "大哥大手机"; } function showCategory() { echo "电子产品"; } }
按照传统方法,我们首页的代码可能会这样写:
class page { function index() { if(isset($_GET['female'])) { }elseif(..) { } } }
那么当我们要新增一个策略时,就要继续添加一个if..else条件判断,当策略越来越多时,可能会使得代码越来越冗长,越来越不好维护,下面介绍采用策略模式的方法:
class page { protected $strategy; function index() { echo "AD:"; $this->strategy->showAd(); echo "<br/>"; echo "Category:"; $this->strategy->showCategory(); } function setStrategy(UserStrategy $strategy) { $this->strategy = $strategy; } } $page = new page; if(isset($_GET['female'])) { $strategy = new FemaleUserStrategy(); } else { $strategy = new MaleUserStrategy(); } $page->setStrategy($strategy); $page->index();
这样,当我们要新增一个策略时,只要新加一个策略类,然后在调用策略时实例化该策略。这样使得代码更加耦合,而且易于维护。
策略模式除了实现分支逻辑处理外,还有一个非常重要的功能,是可以实现Ioc,即依赖倒置、控制反转。在上面的实例中,将page类和两个策略类(FemaleUserStrategy、MaleUserStrategy)关系进行反转,在page页面里面,并不用去具体定义所依赖的类,而是在层实例化策略类后再与page类进行绑定,这种模式在面向对象中经常用到。面向对象中一个很重要的思路就是解耦,如果两个类是互相依赖的关系,那么他们之间就是紧耦合的关系,这样不利于我们去替换其中的某一个类。
使用策略模式,将两个类进行解耦,这样很方便我们去替换其中某一个类。
下一篇: PHP数据对象映射模式