
设计模式
对这是我的昵称
为什么要写简介
展开
-
设计模式之解释器模式
什么是解释器模式官方解释:解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。个人理解:就像语言的翻译,把一段文本解释成自己想要的样子,就像加减乘除,我们想要把它们换成+-*/,并且系统中有多处用到了这些字符,那我们就有必要考虑使用解释器模式,以方便日后的维护或者扩展。使用场景一些简单的文本字符替换,比如把加减乘除换成+-*/示意图原创 2021-12-16 19:01:37 · 151 阅读 · 0 评论 -
设计模式之命令模式
什么是命令模式命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。使用场景命令这个词很容易让我们想到计算机的命令,用户输入命令,交给计算机去执行,此时用户就是调用命令的人(调用者),计算机就是执行者。但是如果用户想输入一个命令就可以同时操控Windows和Linux都关机,应该怎么办呢?此原创 2021-12-14 18:55:01 · 701 阅读 · 0 评论 -
设计模式之责任链模式
什么是责任链模式责任链就是把每个类的职责串联起来,一个接一个的执行,直到执行完为值。使用场景敏感词检测,用户发送一段信息,可能会有手机号,会骂人,但是平台为了和谐,不允许展示这些内容,所以我们需要检测这些内容并做一些处理。如果是传统方式去做,可能就用if-else一个一个去判断,如果要检测的规则非常多,那就会有很多的if-else,代码很臃肿,并且不符合开闭原则。不方便维护和扩展,此时就可以考虑用责任链模式。示意图优点把每个规则单独封装为一个类,每个类有自己的职责,符合设计原则.原创 2021-12-10 17:03:30 · 232 阅读 · 0 评论 -
设计模式之代理模式
什么是代理模式代理这个词很容易理解,比如代购,你委托一个代购代理你买东西,你只需要给他钱、告诉他买什么就行了,不用管买的流程。代理也是这个意思,用户的请求会发送给代理类,代理类会自动调用真实要调用的类,而用户完全不用管要调用哪个类以及这个类做了什么。并且代理类可以随意对真实类进行扩展。这个模式比较简单。使用场景比如说Mysql数据查询,中间用到了Redis缓存,此时Redis就相当于一个代理,用户的数据请求会先通过Redis进行处理,如果Redis中数据不存在,才会到Mysql中查询。示意图原创 2021-12-07 12:19:25 · 262 阅读 · 0 评论 -
设计模式之享元模式
什么是享元模式享元,共享的元素,什么叫共享,就是把东西分享出来,放到一个地方,可以让其他人享用。然而在程序中,这个元素我们可以暂时理解为各种对象、各种类,把他们放到一个数组里,方便统一管理和调用。说起来有点像注册模式和组合模式,都是把类给放到数组里,但是区别是注册模式中的数组元素间没有必然联系,不相互依赖;组合模式是树形结构,具有层级依赖,同级之间不依赖,并且这些元素大致相同,因为它们继承于同一个接口;享元模式类似于组合模式,只不过它采用了一个单独的工厂类来存储类的实例,它的每个元素都必须是至少两个类的原创 2021-12-06 11:55:43 · 469 阅读 · 0 评论 -
设计模式之建造者模式
什么是建造者模式官方解释:使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式个人理解:建造这个词,首先会让我们想到建造一个房子,从零开始,准备混凝土,钢筋,水,砖头等等非常多的材料,用这么多材料最终搭建出一个房子。使用场景一个类很多的属性,如果使用构造方法去初始化这些属性,那会很容易出错,想象以下,比如有4个以上的属性,有必填的,有可选的,你每次初始化这个类的时候,都要一个个去校对每个参数的正确性,是不是也是一个令人烦躁的事情,此原创 2021-12-03 18:02:41 · 506 阅读 · 0 评论 -
设计模式之原型模式
什么是原型模式通过一种克隆的方式去创建对象,节省创建对象的复杂度。使用场景当你需要多次创建一个类的时候,就可以考虑使用原型模式优点从而节省代码冗余,降低系统复杂度,节省资源代码实例目录结构Prototype.php 抽象原型类<?php/** * 抽象原型类 * Class Prototype */abstract class Prototype{ //clone类自身 abstract function copy();}Te.原创 2021-12-03 17:02:07 · 122 阅读 · 0 评论 -
设计模式之外观模式
什么是外观模式我觉得这是最容易理解的一个设计模式了。就是把多个方法的调用封装到一起,方便调用。使用场景比如人People、车Car、桥Bridge这三个对象,要实现一个简单的场景---24岁的人,姓名叫李四,开着红色的车在石桥上跑。如果用传统方式来做,那么每次实现这个场景的时候,都需要实例化People、Car、Bridge这三个类,然后去调用设置名字、设置年龄、设置性别、设置车的颜色、设置桥的种类这6种方法。想象以下前后端对接的场景,这种情况就要提供六个接口给前端,无疑增大了前后端的工原创 2021-12-03 15:08:10 · 343 阅读 · 0 评论 -
设计模式之装饰器模式
什么是装饰器模式官方解释:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。使用场景比如一个煎饼果子,首先肯定得有一个煎饼,然后在煎饼的基础上添加葱花、香菜、脆饼、烤肠、油条等附加品。优点可以动态的、灵活的增删类的功能,解决继承过多的问题,符合设计原则的单一原则和开闭原则。示意图传统模式装饰器模式可以看出,传统模式用了无限继承的方式,如果附加品过多,.原创 2021-12-03 12:15:02 · 305 阅读 · 0 评论 -
设计模式之组合模式
什么是组合模式官方解释:组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。个人理解:就是把一些功能相似的类给组合起来,当然组合并不是合并的意思,而是把这些类有规律的放到一个数组里,类似于树形结构,既然是树形结构,那当然有可能是多维数组,然后通过对数组原创 2021-12-02 17:13:36 · 194 阅读 · 0 评论 -
设计模式之过滤器模式
什么是过滤器模式过滤这个词很容易理解,去掉不要的,只留下需要的。使用场景比如学生升学考试,学校只录取90分以上、10岁以上的学生。张三年龄11考了91分,李四年龄10考了99分,王五年龄12考了60分,这个时候就会过滤掉低于90分和10岁以下的,只留下张三、李四。优点讲过滤器单独剥离出来,后期易扩展易维护,符合设计原则的开闭原则和单一原则缺点可能会降低系统的性能,如果有m个过滤器,n个需要过滤的对象,由于每个过滤器都会过滤所有对象,那么遍历次数就是m*n,所以系统的复杂度为O(m原创 2021-12-02 11:43:13 · 356 阅读 · 0 评论 -
设计模式之桥接模式
什么是桥接模式官方解释:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。我的理解:将原来有关联的类全都单独剥离出来,比如A继承B,B继承C,单独封装为A、B、C,接触三者的继承关系,实现解耦,以免继承太多,给代码维护造成较高的成本。使用场景人开着车在桥上跑,人可以是男人、女人,车可以是公交车、汽车、三轮车,桥可以是铁桥、木桥、石桥。传统模式的写法就是人继承车,车继承桥,但是由于这三个维度都有多种变化,如果用继承来写,势必会造成类的爆炸。传统模式与桥接模式示意图原创 2021-12-01 19:05:08 · 554 阅读 · 0 评论 -
设计模式之注册树模式
什么是注册树模式想象一下树形的挂衣架,你想穿哪个衣服了就拿哪个衣服,注册树模式就像极了挂衣架。注册树模式以一个数组来保存所有会用到的实例,等到用这个实例的时候直接去数组中取就可以了,避免多次创建这个实例。使用场景很多框架会用到注册树模式,比如用户众多的Laravel框架。优点降低资源消耗,提高程序效率示意图项目目录结构代码示例HashGenarate.php 生成hash的单例类<?phpclass HashGenarate{ public.原创 2021-12-01 11:38:43 · 387 阅读 · 0 评论 -
设计模式之适配器模式
什么是适配器模式通过统一的入口去适配到特定的接口。比如手机充电器,充电器大头会把各种不同的电压转成5v的电压,以此达到安全的给手机充电的目的。使用场景比如数据库的配置,你可能在项目中用到了多种数据库,像Mysql、Psql、Sqllite、Oracle等,他们有不同的连接方式和查询方式,此时就非常适合用适配器模式,使用一个统一的入口来调用它们。优点可以让任何两个没有关联的类一起运行。 提高了类的复用。 增加了类的透明度。灵活性好。示意图代码实例首先看下目录结构:.原创 2021-11-30 17:28:23 · 699 阅读 · 0 评论 -
设计模式之策略模式
什么是策略模式简言之,就是针对不同的对象使用不同的策略。使用场景商品打折,针对不同等级的会员会有不同力度的优惠,比如VIP1打九折、VIP2打八折、VIP3打七折等等为什么要使用策略模式如果不用策略模式,你的代码可能是这样的:if($level=='VIP1'){ echo '打九折'; ...以及一些比较复杂的算法逻辑}elseif($level=='VIP2'){ echo '打八折'; ...以及一些比较复杂的算法逻辑 }elseif($原创 2021-11-30 11:34:02 · 260 阅读 · 1 评论 -
设计模式之观察者模式
什么是观察者模式当有一对多的依赖时,当这个一发声变化时,其它的依赖它的对象也需要做出相应的修改。使用场景比如一个乐队比赛,有一个指挥者(也就是那个拿小棒的人),乐队成员中有敲架子鼓的,有吹唢呐的,有弹钢琴的,有拉小提琴的,这些成员都要观察者指挥者的动作,从而保持团队的协作,指挥者动作一变,这些成员都要做出相应的改变。优点观察者和被观察者是抽象耦合的,会建立一套触发机制缺点如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。如果在观察者和观原创 2021-11-29 17:38:08 · 210 阅读 · 0 评论 -
设计模式之工厂模式
工厂模式的优点1、解耦。可以将对象的创建和使用分离。2、可以降低代码重复率。简单工厂通过一个工厂类创建出不同的对象,但是如果需要增加新的对象,就需要修改工厂类,违背开闭设计原则。代码示例://接口类定义类需要实现的动作interface Phone{ public function createPhone();}/***创建苹果手机 * */ class IPhone implements Phone { public function c.原创 2021-11-29 16:35:05 · 164 阅读 · 0 评论 -
设计模式之单例模式
什么是单例模式通过对构造函数__contruct和析构函数__destruct的私有化,从而防止从类的外部通过new创建对象,然后在类的内部来进行实例化,并用静态变量存储到内存中,之后通过判断类是否已经被实例化,如果已经被实例化,则无需再创建对象。使用场景主要用于项目中经常会用到的类,比如数据库类的实例化、Redis类的实例化等优点1.不需要反复的创建对象实例,可以节省内存消耗2.可以提升系统的性能3.提供了唯一实例的受控访问,方便后期维护代码示例 1234原创 2021-11-29 16:25:57 · 154 阅读 · 0 评论 -
设计模式之存在的意义
开场白我自身是一名四年Phper小白,这四年也没少敲代码,但是回头想想,貌似每次做项目,都像是从头开始似的,只是敲代码的速度比以前快了点,查资料的速度比以前快了一点,会用的工具比之前快了一点,四年了,却没有一套自己的代码思想,于是很快就到了自己的瓶颈期,每次只要是遇到了复杂一点的问题,就得想破脑袋,效率低下的去解决。现在,有一个词很流行---深度思考,什么是深度思考,也就是通过现象去看本质。就像当初牛顿被苹果砸了一下,正常人只知道被砸了一下,不知道为什么会被砸一下,这就是现象级反应,而牛顿进行了深度原创 2021-11-29 15:47:26 · 177 阅读 · 0 评论