PHP面试常考之设计模式——策略模式

你好,是我琉忆,PHP程序员面试笔试系列图书的做者。php

本周(2019.3.11至3.15)的一三五更新的文章以下:html

周一:PHP面试常考之设计模式——工厂模式
周三:PHP面试常考之设计模式——建造者模式
周五:PHP面试常考之设计模式——策略模式
本身上传了一本电子书“ 5种原则和23种设计模式”到百度云,关注公众号:“ 琉忆编程库”,回复:“ 23”,我发给你。

如下内容如需转载,请注明做者和出处。程序员


策略模式

介绍

策略模式定义了一系列的算法,并将每个算法封装起来,并且使它们还能够相互替换。策略模式让算法独立于使用它的客户而独立变化。面试

UML图

clipboard.png

说明

抽象策略角色: 策略类,一般由一个接口或者抽象类实现。算法

具体策略角色:包装了相关的算法和行为。编程

环境角色:持有一个策略类的引用,最终给客户端调用。设计模式

应用场景

一、 多个类只区别在表现行为不一样,可使用Strategy模式,在运行时动态选择具体要执行的行为。测试

二、 须要在不一样状况下使用不一样的策略(算法),或者策略还可能在将来用其它方式来实现。this

三、 对客户隐藏具体策略(算法)的实现细节,彼此彻底独立。spa

使用策略模式的好处

一、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承能够把公共的代码转移到父类里面,从而避免重复的代码。

二、 策略模式提供了能够替换继承关系的办法。继承能够处理多种算法或行为。若是不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每个子类提供一个不一样的算法或行为。可是,这样一来算法或行为的使用者就和算法或行为自己混在一块儿。决定使用哪种算法或采起哪种行为的逻辑就和算法或行为的逻辑混合在一块儿,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

三、 使用策略模式能够避免使用多重条件转移语句。多重转移语句不易维护,它把采起哪种算法或采起哪种行为的逻辑与算法或行为的逻辑混合在一块儿,通通列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

实现代码

<?php
header("Content-type:text/html;Charset=utf-8");
//抽象策略接口
abstract class Strategy{
    abstract function wayToSchool();
}
//具体策略角色
class BikeStrategy extends Strategy{
    function wayToSchool(){
         echo "骑自行车去上学";
    }
}
class BusStrategy extends Strategy{
    function wayToSchool(){
         echo "乘公共汽车去上学";
    }
}
class TaxiStrategy extends Strategy{
    function wayToSchool(){
         echo "骑出租车去上学";
    }
}

//环境角色
class Context{
    private $strategy;
    //获取具体策略
    function getStrategy($strategyName){
        try{
            $strategyReflection = new ReflectionClass($strategyName);
            $this->strategy = $strategyReflection->newInstance();

        }catch(ReflectionException $e){
             $this->strategy = ""; 
        }       
    }

    function goToSchool(){
        $this->strategy->wayToSchool();
        // var_dump($this->strategy);
    }
}

//测试
$context = new Context();
$context->getStrategy("BusStrategy");
$context->goToSchool();
 ?>
本身上传了一本电子书“ 5种原则和23种设计模式”到百度云,关注公众号:“ 琉忆编程库”,回复:“ 23”,我发给你。

本身编写的《PHP程序员面试笔试宝典》《PHP程序员面试笔试真题解析》书籍,已在各大电商平台销售。书籍在手,Offer我有。
图片描述
更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库

clipboard.png

对本文有什么问题或建议均可以进行留言,我将不断完善追求极致,感谢大家的支持。

相关文章
相关标签/搜索