PHP 设计模式 笔记与总结(8)策略模式

本文通过一个电商网站案例,展示了如何利用策略模式实现不同用户群体的个性化推荐。策略模式能够灵活地在运行时选择合适的算法,降低了类间的耦合度。

① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。

② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。

 

在 Common 目录下新建 UserStrategy.php,定义接口:

<?php
namespace Common;

//定义策略接口
interface UserStrategy{
    //显示广告
    function showAd();
    //展示类目
    function showCategory();
}

在 Common 目录下新建 FemaleUserStrategy.php ,女性用户的策略实现:

<?php
/*
 * 女性用户的策略实现
 */
namespace Common;
use Common\UserStrategy;

class FemaleUserStrategy implements UserStrategy{
   
    function showAd(){
        echo '2015春夏新款女装';
    }
   
    function showCategory(){
        echo '女装';
    }
} 

 

在 Common 目录下新建 MaleUserStrategy.php ,男性用户的策略实现:  

<?php
/*
 * 男性用户的策略实现
 */
namespace Common;
use Common\UserStrategy;

class MaleUserStrategy implements UserStrategy{
   
    function showAd(){
        echo 'Apple Watch';
    }
   
    function showCategory(){
        echo '电子产品';
    }
} 

 

入口文件 index.php:

<?php
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');

class Page{
    
    protected $strategy;
            
    function index(){
        echo 'AD:';
        $this->strategy->showAd();
        echo '<br>Category:';
        $this->strategy->showCategory();
    }
    
    //用于外部设置策略
    function setStrategy(\Common\UserStrategy $strategy){
        $this->strategy = $strategy;
    }
}

$page = new Page();
if(isset($_GET['female'])){
    $strategy = new \Common\FemaleUserStrategy();
}else{
    $strategy = new \Common\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();

访问 http://127.0.0.17/php/design/psr0/index.php?female

输出:

AD:2015春夏新款女装
Category:女装

访问 http://127.0.0.17/php/design/psr0/index.php

输出:

AD:Apple Watch
Category:电子产品


 

【策略模式的控制反转】

③ 使用策略模式可以实现 Ioc,依赖倒置、控制反转

在上例中 Page 类 依赖于 MaleUserStrategy 类和 FemaleUserStrategy 类。在 Page 类中不需要实现这两个类,在执行的过程中,才将这个关系进行绑定。

 

==

如果两个类是互相依赖的关系,那么它们之间就是一个紧耦合的设计,不利于替换其中某一个环节;而策略模式使用依赖倒置以后,就可以很方便地替换其中某一个类。

转载于:https://www.cnblogs.com/dee0912/p/4417611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值