php面向对象的封装,继承,多态,使得它拥有多种多样的设计模式,这些设计模式的最终目的是实现代码的解耦,php框架就是由于这些设计模式的引入而变得更加优雅。这里进行简单的总结。
1,设计模式记忆方法
单例模式,工厂模式,注册树模式,适配器模式,策略模式,观察者模式,映射模式,原型模式,装饰模式,迭代器模式,代理模式。
我的记忆方法是取模式类型的首个字连成一句话,单公主是侧观影原装迭代。当然你可以有自己的记忆方法,这个是很随机的, 可以调整字的顺序及谐音字,只要好记及可。别感觉这个没用,如果发展成长期记忆,就会顺手拈来,成为自己永远的知识点。下面进行逐一的解释。
2,单例模式
相比于其他的设计模式,单例模式没有用任何的interface,或abstract,只用到一个class,将构造方法私有化,然后内部函数创建自己并做出判断,用静态变量存储生成的对象,以便在整个php运行阶段进行使用,由于代码有点长,可以百度单例模式进行比对。
3,工厂模式
特点是创建一个类,用类里面的静态方法去创建其他类的对象,这样的好处是通过工厂模式创建的对象都是一个模式的,如果创建的对象的名称发生改动,只需要改变工厂模式中new对象时的名称即可,不用在所有代码全部发生改动
4,注册树模式
特点是通过自身的静态变量保存对象,在全局都可以使用。本身类包含三个方法,set,get,unset,new一个新对象后,通过set注册到这个类中,用的时候只要从这个类中获取即可,很多框架都有这个应用,如注册session,路由等
5,适配器模式
这里用到了interface,通过interface规定好connect方法,close方法,及他们所需要的参数。然后用mysql类,mysqli类及pdo类分别继承这个接口,在使用时,new mysql类对外的接口都是connect和close方法,且参数一致,如果项目需要改为mysqli,只需要将new mysql改为mysqli即可。
6,策略模式
应用场景是网站需要对男生女生产生不同的页面内容,如果是一般的代码设计,就是在首页的index方法中对get或者session中的数据进行if判断,这样耦合过于严重,这时需要有个interface规定好index中需要用到的方法,如showad();同时首页的class中创建一个传入strategy策略的方法,setstrategy,这个方法的参数是接口的实现对象,然后在首页index方法中调用方法,达到解耦目的。然后去创建两个继承接口的类,一个是male一个是femal,分别实现各自的方法,在new 首页类之后,通过判断,注册不同的male和female对象到首页类对象中,首页类对象没有任何判断只是调用了接口中的方法而已,所以这是解耦的
7,观察者模式
用到了事件发生者abstract,观察者interface,和事件发生类,和观察者类,事件发生者抽象类规定了必须有addObserver方法和notify方法,观察者interface规定了每个观察者必须有update方法,以供notify方法进行调用,事件发生类继承事件发生者抽象类,并且在事件发生后去调用抽象类的notify方法,通过遍历加入的观察者,分别执行他们的update方法。这样就达到了整个业务逻辑的解耦
8,映射模式
在框架中我们总是能够用new的model类当做对象$mode->id=1;这种方式进行增删改查,这就是通过映射模式做到的,通过构造函数和析构函数,执行sql语句,然后返回数据对象,并分别将他们对应的赋值映射到model类的对象中,通过修改后在析构函数中进行update操作,达到修改数据库的目的
9,原型模式
在大对象中通过new和初始化对象太占资源,可以在初始化之后,通过clone关键字,clone对象,在进行下面的操作,可以省去大部分的初始化的工作
10,装饰模式
在框架中经常可以看到beforeInsert(),afterUpdate()这种操作,就是在插入之前或者更新之后固定进行的操作,这就是通过装饰模式实现的。就是在classA中加入beforeInsert()方法,在insert方法中调用$this->beforeInsert()方法,这个方法会从自身的装饰器中foreach所有的装饰起,并调用所有继承了接口的装饰器的beforeInsert方法,进行相应的操作。
11,迭代器模式
这个就是让对象可以通过foreach遍历所有的内容,具体可以查看网上的教程,很多
12,代理模式
比如说数据库读写分离后,在读的时候需要用到从库,写的时候需要用到主库,这时通过interface约束好两个方法,一个是read方法,一个是write方法,proxy继承这个接口后,实现read方法时去链接从库,write时去连接主库,这样就能达到相应的目的。