PHP 设计模式十二 策略模式

207 阅读1分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

课程背景

  • 最近完成一个项目 对于代码分层有了一丢丢了解 但是架构设计合理性上存在问题
  • 万物看本质基本功硬 底层知识扎实才能写出更优质的代码 才能走得更远
  • 作为努力奔跑的程序员 又一次的去温习 思考 设计模式等基础的php知识
  • 因为掘金粑粑有奖励,所以把学习的笔记整理记录并分享了出来。

正文开始

上一章节中我们编写了策略规则,并编写了两种具体的实现。这里,我们继续。 3 我们在index.php中先模拟控制器中的操作 硬编码的方式不是我们希望的

<?php
define("BASE_DIR",__DIR__);  //文件基础目录
require BASE_DIR . '\Liiy\Loader.php';  //加载自动加载类
spl_autoload_register("\Liiy\Loader::autoload"); //指定自动加载方法

class Page{
    public function index(){
        //接收参数
        if($_GET['female']){

        }else{

        }
    }
}

$page = new Page();
$page->index();

4 定义方法暴露给外部

image.png 因为所有的策略都具体实现了接口,所以在设置策略的时候指定必须是实现了当前策略的对象。

5 所以这里只需要根据参数不同给予不同策略实体即可

image.png

6 然后在index的方法中,不用管具体是那个策略,具体是怎么实现的。只需要调用响应的方法即可。

<?php
define("BASE_DIR",__DIR__);  //文件基础目录
require BASE_DIR . '\Liiy\Loader.php';  //加载自动加载类
spl_autoload_register("\Liiy\Loader::autoload"); //指定自动加载方法

class Page{
    protected $stragegy;
    //方法
    public function index(){
        echo '广告';
        $this->stragegy->showAd();

        echo '类别';
        $this->stragegy->showCategory();
    }

    //设置统一策略
    public function setStrategy(\Liiy\UserStrategy $strategy){
        $this->stragegy = $strategy;
    }
}

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

总结 策略模式还有个好处是解耦合,只有在调用过程中使用某一个类的时候,才去引用。实现了一个控制反转的功能。