「这是我参与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 定义方法暴露给外部
因为所有的策略都具体实现了接口,所以在设置策略的时候指定必须是实现了当前策略的对象。
5 所以这里只需要根据参数不同给予不同策略实体即可
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();
总结
策略模式还有个好处是解耦合,只有在调用过程中使用某一个类的时候,才去引用。实现了一个控制反转的功能。