![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
私念
PHP GOLANG
展开
-
php中如何优雅的写复杂if-else
参考:https://www.phpmianshi.com/?id=197提前return优化逻辑结构,让正常流程走主干,非正常流程提前return,去除不必要的else优化前$a=1;$b=2;$c=3;if($a==1){if($b==2){if($c==3){returntrue;}}}returnfalse;优化后$a=1;$b=...原创 2020-12-15 09:38:08 · 492 阅读 · 0 评论 -
基于rebase的Git工作流
参考:https://www.phpmianshi.com/?id=124使用Git在多人协作的过程中,我们也会面临如何运用好Git的问题。这种情况下,就出现了各种各样的Git Workflow,而本文将介绍一种基于rebase的工作流,这种工作流也是目前开源社区所比较推崇的做法,了解了这种工作流之后可以更规范的使用Git一、Rebase和Squash1、Rebase是什么,为什么使用Rebaserebase是能够将我们对代码的更改从一个分支集成到另一个分支中的git命令之一(另一个命令是M原创 2020-12-11 10:12:25 · 907 阅读 · 0 评论 -
如何写出漂亮的代码-代码整洁之道
参考:https://www.phpmianshi.com/?id=196背景代码本就该是直接简单的,横就是横,纵就是纵,架构原本也本是清晰明了的,模块是模块,过程是过程。可随着项目生命周期的变长,随着需求不断的被实现,面对不同思想的人,不同场景的要求,不同技能水平的实施,就让原本平直的路走成了立交桥,织成了逻辑网。这时候再浏览代码,要走通某一个流程,即便是熟悉路况的“本地人”,编写代码的“原住民”也不一定能走的顺畅。Robert Martin的这句话非常合适:“唯一能有效测量代.原创 2020-12-07 14:33:56 · 256 阅读 · 0 评论 -
Laravel中用到的设计模式
参考:https://www.phpmianshi.com/?id=891:工厂模式Auth::user()此处Auth这个类就是工厂中的方法,Auth是注册树中的别名。好处:类似于函数的封装,使对象有一个统一的生成(实例化)入口。当我们对象所对应的类的类名发生变化的时候,我们只需要改一下工厂类类里面的实例化方法即可。2:单例模式好处:对象不可外部实例化并且只能实例化一次,节省资源。实现方式:privatestatic$ins=null;...原创 2020-08-03 20:32:24 · 774 阅读 · 0 评论 -
Laravel神奇的IoC容器
Laravel 的核心就是一个IoC 容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是IoC(控制反转)和DI(依赖注入)超人和超能力,依赖的产生!我们把一个“超人”作为一个类,一个超人肯定拥有至少一个超能力,这个超能力也可以抽象为一个对象。classPower{/***能力值*/protected$ability;/***能力范围或距离*/protected...原创 2020-08-02 11:31:36 · 253 阅读 · 0 评论 -
Laravel中的基本概念
参考:https://www.phpmianshi.com/?id=37一.什么是 DI依赖注入/IOC控制反转DI依赖注入啥都不说,直接上代码<?phpclassUserController{private$user;function__construct(UserModel$user){$this->user=$user;}}$u...原创 2020-08-02 10:35:04 · 187 阅读 · 0 评论 -
设计模式的基本原则
设计模式设计模式的世界丰富多彩,比如生产一个个「产品」的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事的策略模式,构建步骤稳定、根据构建过程的不同配置构建出不同对象的建造者模式等。面向对象结合设计模式,才能真正体会到程序变得可维护、可复用、可扩展、灵活性好。设计模式对于程序员而言并不陌生,每个程序员在编程时都会或多或少地接触到设计模式。无论是在大型程序的架构中,亦或是在源码的学习中,设计模式都扮演着非常重要的角色。设计模式基于六大原则 开闭原则:一个软件实体如类、模.原创 2020-07-30 15:03:38 · 196 阅读 · 0 评论 -
代理模式、桥接模式、中介者模式区别和联系
参考:https://www.phpmianshi.com/?id=134联系在现实生活中,如房屋中介、买房人、卖房人,房屋中介是一个中介,因为它担任买房人和卖房人之间的相同;房屋中介也是一个代理,它在卖房人眼前是买房人的代理,在卖房人眼前是买房人的代理;最后房屋中介也是一个桥接,用于连接买房人和卖房人。那这字面意思相似的三者到底有什么不同的应用场景。代理模式场景 1. 最常见的就是数据库中间件,他们代理了数据库的访问,访问一个集群跟访问一个单机数据...原创 2020-07-30 14:50:31 · 3370 阅读 · 1 评论 -
php中介者模式
参考:https://www.phpmianshi.com/?id=145概念中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。场景 我们有一个CD类和一个MP3类,两个类的结构相似。 我们需要在CD类更新的时候,同步更新MP3类。 传统的做法就是在CD类中实例化MP3类...原创 2020-07-28 21:17:41 · 131 阅读 · 0 评论 -
php中的状态模式
参考:https://www.phpmianshi.com/?id=140概念状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。角色上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。抽象状态(State):定义一个接口以封装使用上下..原创 2020-07-27 20:02:55 · 178 阅读 · 0 评论 -
php中的模板模式
参考:https://www.phpmianshi.com/?id=139概念在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。示例<?phpabstract class Game{ ..原创 2020-07-26 12:57:18 · 139 阅读 · 0 评论 -
php中的依赖注入模式
参考:https://www.phpmianshi.com/?id=131概念依赖注入模式(Dependency Injection),用松散耦合的方式来更好的实现可测试、可维护和可扩展的代码。依赖注入模式是控制反转(Inversion of Control)的一种实现方式。要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器 / 方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。示..原创 2020-07-26 12:48:03 · 187 阅读 · 1 评论 -
php中的组合模式
参考:https://www.phpmianshi.com/?id=129概念当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用时,这种情形则适合使用组合模式的设计。示例一个表单类实例在处理其表单所有元素的方法与处理该表单自身实例方法相同,在调用方法 render()时,会随之遍历它的所有子元素并对他们调用render()方法<?phpinterfaceRenderableInterface{publ...原创 2020-07-24 15:20:44 · 98 阅读 · 0 评论 -
对象池模式和注册树模式的区别和联系
参考:https://www.phpmianshi.com/?id=127区别对象池主在对象创建开销较大或要控制对象数量的时候使用。最常见的对象池应该是数据库连接池和线程池,例如程序需要数据库连接时从连接池中取一个(连接池里有多个连接),用完了不是关闭连接而是把连接放回连接池给其他程序使用。一个对象池通常只放同一类的对象。注册树(Registry模式)其实类似对象池,但是里面各种类型的对象都放一个,方便程序通过Registry找到这些对象直接使用而不需自己创建。联系两者...原创 2020-07-23 09:07:42 · 121 阅读 · 0 评论 -
php中的对象池模式
参考:https://www.phpmianshi.com/?id=126概念对象池设计模式是创建型设计模式,它会对新创建的对象应用一系列的初始化操作,让对象保持立即可使用的状态 - 一个存放对象的 “池子” - 而不是对对象进行一次性的的使用(创建并使用,完成之后立即销毁)。对象池的使用者会对对象池发起请求,以期望获取一个对象,并使用获取到的对象进行一系列操作,当使用者对对象的使用完成之后,使用者会将由对象池的对象创建工厂创建的对象返回给对象池,而不是用完之后销毁获取到的对象。对象池在..原创 2020-07-22 19:50:13 · 256 阅读 · 0 评论 -
php中享元模式
参考:https://www.phpmianshi.com/?id=132概念享元模式(Flyweight),为了节约内存的使用,享元模式会尽量使类似的对象共享内存。在大量类似对象被使用的情况中这是十分必要的。常用做法是在外部数据结构中保存类似对象的状态,并在需要时将他们传递给享元对象示例<?php/***创建享元接口FlyweightInterface。*/interfaceFlyweightInterface{/***创...原创 2020-07-22 19:47:49 · 148 阅读 · 0 评论 -
php中的数据映射模式
参考:https://www.phpmianshi.com/?id=130概念数据对象映射模式,就是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,数据映射模式使您能更好的组织你的应用程序与数据库进行交互。大家如果用过 thinkphp 这个框架,应该知道里面的 Model 吧,当你 new User(或 $user = M(‘User’)) 的时候,其实就是在操作 user 表示例classUser{//分别对应User表里面的四...原创 2020-07-20 12:04:48 · 522 阅读 · 0 评论 -
php中的流接口模式
参考:https://www.phpmianshi.com/?id=128概念流接口模式(Fluent Interface)用来编写易于阅读的代码,就像自然语言一样(如英语)场景Doctrine2 的 QueryBuilder,就像下面例子中类似PHPUnit 使用连贯接口来创建 mock 对象Yii 框架:CDbCommand 与 CActiveRecord 也使用此模式示例<?phpclassSql{/***@vara...原创 2020-07-19 16:45:04 · 212 阅读 · 0 评论 -
php中的门面模式Facade
参考:https://www.phpmianshi.com/?id=70概念门面模式又叫外观模式,用来隐藏系统的复杂性,提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。构成1.定义一个(或多个)具备所需接口的新类(门面类Facade)2.新类门户(门面类Facade)使用原来的系统(包含Hotel,Traffic,ScenicAr..原创 2020-07-16 21:13:44 · 361 阅读 · 0 评论 -
php中的代理模式
参考:https://www.phpmianshi.com/?id=69概念代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服.原创 2020-07-13 20:49:21 · 413 阅读 · 0 评论 -
php中的迭代器模式
参考:https://www.phpmianshi.com/?id=68概念迭代器:类继承PHP的Iterator接口,批量操作。1. 迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。2. 相比传统的编程模式,迭代器模式可以隐藏遍历元素的所需操作。示例接口Iteratorcurrent() 返回当前元素key() 返回当前元素的键next() 向前移动到下一个元素rewind() 返回到迭代器的第一个元素valid() 验证是否有效class.原创 2020-07-10 18:09:44 · 138 阅读 · 0 评论 -
php中原型模式(Prototype Pattern)
参考:https://www.phpmianshi.com/?id=67概念原型模式(Prototype Pattern):与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销场景多用于创建大对象,或初始化繁琐的对象。如游戏中的背景,地图。web中的画布等等1,有些时候,我们需要创建多个类似的大对象。如果直接通过new对象,开销很大,而且new完还得进行重复的初始化工作。可能把初始化工作封装起来的,但是对于系统来说,你封不封装,初始化..原创 2020-07-09 22:08:15 · 147 阅读 · 0 评论 -
策略模式与桥接模式区别
参考:https://www.phpmianshi.com/?id=65实际上所有模式可以只分为类模式和对象模式两种,类模式是用继承而对象模式是用委托。Bridge模式和Strategy模式相似就是因为他们都将任务委托给了另外一个接口的具体实现,他们之间的区别在于Bridge的目的是让底层实现和上层接口可以分别演化,从而提高移植性而Strategy的目的是将复杂的算法封装起来,从而便于替换不同的算法。因此可以想象一般情况下Bridge的实现几乎不会在运行时更改而Strategy的算法则很有可能.原创 2020-07-08 22:14:24 · 1054 阅读 · 1 评论 -
php中的桥接模式
参考:https://www.phpmianshi.com/?id=64桥接模式 (Bridge Pattern):将抽象与实现解耦,使得两者可以独立的变化(一)为什么需要桥接模式1,如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。2,抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色原创 2020-07-07 09:13:35 · 179 阅读 · 0 评论 -
linux中tcpdump的详细用法
参考:https://www.phpmianshi.com/?id=115在调试网络通信程序是tcpdump是必备工具。tcpdump很强大,可以看到网络通信的每个细节。如TCP,可以看到3次握手,PUSH/ACK数据推送,close4次挥手,全部细节。包括每一次网络收包的字节数,时间等。tcpdump的选项 -a —— 将网络地址和广播地址转变成名字 -d ——将匹配信息包的代码以人们能够理解的汇编格式给出 -dd ——将匹配信息包的代码以c语言程序段的格式给出 ..原创 2020-07-05 14:04:49 · 540 阅读 · 0 评论 -
php中适配器模式与装饰器模式的区别
参考:https://www.phpmianshi.com/?id=63概念适配器与装饰器模式的别名都是包装模式(Wrapper)。区别适配器模式的意义将一个接口转变成另一个接口,目的是通过改变接口来达到重复使用的目的。装饰器模式的意义不改变被装饰对象的接口,而是保持原有的接口,增强原有对象的功能,或改变原有对象的处理方式而增提高性能。...原创 2020-07-02 15:52:11 · 216 阅读 · 0 评论 -
php中的适配器模式
参考:https://www.phpmianshi.com/?id=62概念适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间。场景老代码接口不适应新的接口需求,或者代码很多很乱不便于继续修改,或者使用第三方类库。例如:php连接数据库的方法:mysql,,mysqli,pdo,可以用适配器统一示例/**在我们的示例中,目标接口是MonkeyInterface,*...原创 2020-07-01 11:48:38 · 267 阅读 · 1 评论 -
php中装饰器模式
概念装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点..原创 2020-06-30 15:09:28 · 143 阅读 · 1 评论 -
php中策略模式详解
参考:https://www.phpmianshi.com/?id=60概念在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。场景场景1:假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。场景2:例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,...原创 2020-06-29 11:13:19 · 106 阅读 · 0 评论 -
php中责任链模式
参考:https://www.phpmianshi.com/?id=59概念又叫职责链模式。包含了一些命令对象和一些处理对象,每个处理对象决定它能处理哪些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。示例情景一: 当用户发布一个帖子时: 如果版主可以决定,就版主处理; 如果版主不能决定,就交给上一级管理员处理; 如果管理员不能决定,就交给上一级治安部门处理...原创 2020-06-28 16:04:47 · 164 阅读 · 1 评论 -
php中spl库观察者模式接口
参考:https://www.phpmianshi.com/?id=58PHP-SPL标准库中实现了观察者模式接口,PHP内置提供了两个接口来供外部应用区实现这个模式。<文档>http://www.php.net/manual/zh/splobserver.update.phpSplSubject 接口SplSubject代表着被观察的对象,其结构:interfaceSplSubject{//添加(注册)一个观察者publicfunctionat...原创 2020-06-23 11:43:18 · 162 阅读 · 0 评论 -
单例模式(Singleton)和 多例模式(Multiton)
参考:https://www.phpmianshi.com/?id=461、概念简单说来,单例模式的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点。 常见使用实例:数据库连接器;日志记录器(如果有多种用途使用多例模式);锁定文件。2、示例Singleton.php<?php/** * Singleton类 */class Singleton{ private static $inst原创 2020-06-22 14:17:15 · 701 阅读 · 0 评论 -
PHP简单工厂、工厂方法和抽象工厂对比
https://www.phpmianshi.com/?id=47PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。根据抽象程度不同,php工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式简单工厂模式:/***简单工厂模式与工厂方法模式比较。*简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静...原创 2020-06-21 17:27:27 · 318 阅读 · 0 评论 -
Laravel神奇的服务容器
IoC 容器, laravel 的核心Laravel 的核心就是一个IoC 容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是IoC(控制反转)和DI(依赖注入)超人和超能力,依赖的产生!面向对象编程,有以下几样东西无时不刻的接触:接口、类还有对象。这其中,接口是类的原型,一个类必须要遵守其实现的接口;对象则是一个类实例化后的产物,我们称其为一个实例。我们把...原创 2019-12-17 17:57:26 · 121 阅读 · 0 评论 -
浅谈 Laravel 设计模式
一.什么是 DI依赖注入/IOC控制反转.#DI依赖注入啥都不说,直接上代码<?php class UserController { private $user; function __construct(UserModel $user) { $this->user = $user; ...原创 2019-12-17 17:42:41 · 378 阅读 · 0 评论 -
设计模式-五种构建型模式
设计模式的六大原则设计模式的世界丰富多彩,比如生产一个个「产品」的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事的策略模式,构建步骤稳定、根据构建过程的不同配置构建出不同对象的建造者模式等。面向对象结合设计模式,才能真正体会到程序变得可维护、可复用、可扩展、灵活性好。设计模式对于程序员而言并不陌生,每个程序员在编程时都会或多或少地接触到设计模式。无论是在大型程序的架构中,...原创 2019-10-11 10:20:02 · 565 阅读 · 0 评论