问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么理解php中的设计模式

发布网友 发布时间:2022-04-22 15:20

我来回答

2个回答

懂视网 时间:2022-04-28 10:56

模板方法模式也是一种常用的设计模式,它属于行为性设计模式。它的定义是:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

场景

一般周末早上起来比较晚,就不会出去买早点吃,可能就会泡一桶方便面或酸辣粉或淮南牛肉汤。泡方便面或酸辣粉的步骤是一样的,首先需要准备开水,然后用开水泡方便面或酸辣粉,接下来加入自己的调料包,最后泡上2~3分钟就行了。这中间有两个步骤完全一致(准备开水、泡2~3分钟)、有两个步骤类似(泡食材、加入各自调料包)。

对于上面的场景,我们可以定义一个泡方便面或酸辣粉的算法。这个算法非常简单,4个步骤

  • 准备开水

  • 泡食材(方便面或酸辣粉)

  • 加调料(方便面、酸辣粉有自己的调料包)

  • 在开水中浸泡2~3分钟

  • 现在,我们用模板方法模式来完成上述需求。

    首先,定义一个抽象类,抽象类里定义具体的算法,以及各个步骤。

    abstract class Breakfast
    {
     final public function prepare () {
     $this->boilWater();
     $this->brew();
     $this->addSeasoning(); 
     $this->wait();
     }
     
     public function boilWater ()
     {
     echo '准备开水' . PHP_EOL;
     }
     
     // 泡食材
     abstract public function brew ();
     
     // 加调料
     abstract public function addSeasoning ();
     
     public function wait ()
     {
     echo '等待2~3分钟' . PHP_EOL;
     }
    }

    prepare方法里就是具体的算法,给这个方法加上final是防止该方法被重写。另外,你可以看到这里面有两个抽象方法,需要后代去自行完成。

    接下来,我们来完成方便面及酸辣粉的类。这两个类需继承Breakfast,然后完成抽象方法。

    class Noodle extends Breakfast
    {
     public function brew ()
     {
     echo '加入方便面' . PHP_EOL;
     }
     public function addSeasoning ()
     {
     echo '加入方便面的调料包' . PHP_EOL;
     }
    }
    
    class Powder extends Breakfast
    {
     public function brew ()
     {
     echo '加入酸辣粉' . PHP_EOL;
     }
     public function addSeasoning ()
     {
     echo '加入酸辣粉的调料包' . PHP_EOL;
     }
    }

    上述的例子就是一个典型的模板方法模式,父类里定义算法骨架,子类完成算法中的一些步骤。

    钩子

    上述的例子,体现了模板方法模式中一个常用场景:复用。除了复用外,模板方法模式还是一个重要的应用——扩展。

    模板方法模式是通过钩子来实现扩展的。钩子是一种声明在抽象类中的方法,但只有空的或默认的实现。钩子的存在,让子类有能力对算法不同点进行挂钩。要不要挂钩,由子类自己决定。

    下面我们继续通过例子来讲解钩子的使用,一般我吃泡面的时候,会加火腿或鸡蛋。加火腿和鸡蛋这个是不确定的,所以我们可以钩子,让子类自己决定要不要加火腿或鸡蛋。

    修改Breakfast.php

    abstract class Breakfast
    {
     final public function prepare () {
     $this->boilWater();
     $this->brew();
     $this->addSeasoning();
     $this->hook();
     $this->wait();
     }
     
     
     // 省略部分方法
     
     
     // 默认不做任何事情
     public function hook () :void
     {}
    }

    修改Noodle.php,重写hook方法

    public function hook(): void
    {
     echo '加入火腿和鸡蛋' . PHP_EOL;
    }

    模板方法模式与回调函数

    php中有许多的函数用了类似模板方法模式或策略模式的思想,比如sort()函数,它封装了排序的算法,但是具体的排序规则,由回调函数去完成。通过回调函数就不用去创建抽象类以及子类了,大大的减少了代码量。

    模板方法模式与工厂方法模式、策略模式的关系

    工厂方法模式时模板方法模式一个特殊的形式。

    模板方法基于继承机制: 它允许你通过扩展子类中的部分内容来改变部分算法。

    策略模式基于组合机制: 你可以通过对相应行为提供不同的策略来改变对象的部分行为。

    模板方法在类层次上运作, 因此它是静态的。 策略在对象层次上运作, 因此允许在运行时切换行为。

    热心网友 时间:2022-04-28 08:04

    1、单例模式:PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,因此PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:

    a. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    中支黄金叶什么价 怎么在整个PPT中加入背景音乐,而不是在一张幻灯片中插入,我要的是从... 构造柱有哪些构造措施 中国风的女式花裤配什么鞋 留抵抵税额是什么意思 留抵税抵什么意思 ...里发现很多门店装修和华为一样的,但是官网查不到,这种店铺购买... 墙布贴了关窗多久 墙布贴了要关窗多久 墙布贴好要多久密闭多久 word文档里面的箭头符号如何去掉 word箭头符号怎么去掉 Word文档里行的末尾一个向下的箭头是什么? Word文档回车之后的小箭头如何能打印出来呢? word文档中一行文字后的下箭头和下左拐箭头有什么不同 2009年6月4号安徽影视午夜影院电影叫什么?? 404 Not Found 求午夜好电影 WORD里的字后面的小箭头怎么去掉啊? 看上去挺碍眼 求午夜43路视频下载啊,不要地址。 观看午夜影视要不要付费 word中如何调正文字后面的箭头? word里打完每行字,后面得箭头怎么去掉 安徽影视频道午夜影院电影 《午夜心跳》免费在线观看完整版高清,求百度网盘资源 午夜美剧电影网地址是多少就是可以看美剧的网站里面 爱在午夜降临前 剧情 求 德州午夜 1~2季 百度云免费在线观看资源 午夜电影完整版电影 摄像机和显示器属于什么媒体 php多端登录用什么设计模式 什么是PHP中的工厂设计模式 移动办宽带送无线路由器? 南京移动宽带送路由器都是 中国移动随州装宽多少钱一年?三个月能否装费用多少? 在移动办了一个宽带300兆的光纤,今天工作人员来安装了,他们还送了一个华为路由器质量如何? 移动家庭宽带送路由器吗 刚办的移动宽带送的还带路由器功能是真的吗 移动赠送宽带,如果自己买路由器装上还要缴费吗? 苹果6手机外壳与屏幕之间有缝,这是为什么? 苹果6 plus边框有缝隙正常吗? iPhone6屏幕和边框出现裂缝怎么办? 苹果6屏幕和边框闭合不严,是通病吗? iPhone6Plus边框有缝隙影响使用吗 苹果6plus屏幕和机身有缝隙是正常的吗 iphone 6更换屏幕后边框与屏幕有缝隙怎么办? 苹果手机外屏与内屏之间有些缝隙怎么办 iphone6p屏幕与边框有缝隙怎么办 弯钩耳钉怎么摘 枪打的耳洞的枪针(银针)怎么取下来