zoukankan      html  css  js  c++  java
  • PHP 设计模式 笔记与总结(8)策略模式

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

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

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

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

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

    <?php
    /*
     * 女性用户的策略实现
     */
    namespace Common;
    use CommonUserStrategy;
    
    class FemaleUserStrategy implements UserStrategy{
       
        function showAd(){
            echo '2015春夏新款女装';
        }
       
        function showCategory(){
            echo '女装';
        }
    } 

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

    <?php
    /*
     * 男性用户的策略实现
     */
    namespace Common;
    use CommonUserStrategy;
    
    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(CommonUserStrategy $strategy){
            $this->strategy = $strategy;
        }
    }
    
    $page = new Page();
    if(isset($_GET['female'])){
        $strategy = new CommonFemaleUserStrategy();
    }else{
        $strategy = new CommonMaleUserStrategy();
    }
    $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 类中不需要实现这两个类,在执行的过程中,才将这个关系进行绑定。

    ==

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

  • 相关阅读:
    java学习之—栈
    java中的a++与++a的区别
    java学习之—数组的曾删改查
    Mybatis #{ } 和 ${ } 区别
    详解Windows不重启使环境变量修改生效(经典)
    laravel artisan常用命令
    Laravel 出现 No application encryption key has been specified.
    springboot的几种启动方式
    Angular 服务的简单使用
    Angular-1.6 路由 简单使用
  • 原文地址:https://www.cnblogs.com/dee0912/p/4417611.html
Copyright © 2011-2022 走看看