php设计模式概述

工厂模式:

我们定义一个专门用来创建其它对象的类。 这样在需要调用某个类的时候,我们就不需要去使用new关键字实例化这个类,而是通过我们的工厂类调用某个方法得到类的实例。

好处:当我们对象所对应的类的类名发生变化的时候,我们只需要改一下工厂类类里面的实例化方法即可。不需要外部改所有的地方。

单例模式(口诀:三私一公)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Singleton{
//私有化构造方法,禁止外部实例化对象
private function __construct(){}
//私有化__clone,防止对象被克隆
private function __clone(){}
//私有化内部实例化的对象
private static $instance = null;
// 公有静态实例方法
public static function getInstance(){
if(self::$instance == null){
//内部实例化对象
self::$instance = new self();
}
return self::$instance;
}
}

注册器模式:

用来将一些对象注册到全局的注册树上,可以在任何地方访问。

1
2
3
set():将对象隐射到全局树上,
_unset():从树上移除。
get():去注册到树上的对象。

适配器模式:

1、可以将截然不同的函数接口封装成统一的API

2、实际应用举例:PHP的数据库操作有mysql/mysqli/pdo 三种,可以用适配器模式统一成一致。类似的场景还有cache适配器,可以将memcache/redis/file/apc等不同的缓存函数统一成一致的接口。

策略模式:

1、策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式

2、实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类名,并且所有广告位展示不同的广告,传统的做法是加入if…else… 判断。
如果新增加一种用户类型,只需要新增加一种策略即可

3、使用策略模式可以实现Ioc ,依赖倒置,控制反转

数据对象映射模式:

1、数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作,比我们在代码中new一个对象,那么使用该模式就可以将对对象的一些操作,比如说我们设置的一些属性,它就会自动保存到数据库,跟数据库中表的一条记录对应起来

实例,在代码中实现数据对象映射模式,我们将写一个ORM类,将复杂的SQL语句映射成对象属性的操作
结合使用数据对象映射模式,工厂模式,注册模式

对象关系映射

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换[1] 。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生
简单的说:ORM相当于中继数据

适配器模式:

1、可以将截然不同的函数接口封装成统一的API

2、实际应用举例:PHP的数据库操作有mysql/mysqli/pdo 三种,可以用适配器模式统一成一致。类似的场景还有cache适配器,可以将memcache/redis/file/apc等不同的缓存函数统一成一致的接口。

观察者模式

1、 观察者模式( Observer ),当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新

2、 场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多后,代码会变得难以维护。这种方式是耦合的,入侵式的,增加新的逻辑需要修改事件主体的代码

3、观察者模式实现了低耦合,非入侵式的通知与更新机制

原型模式

1、 与工厂模式作用类似,都是用来创建对象

2、 与工厂模式的实现不懂,原型模式是首先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建是重复的初始化操作

3、 原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可

装饰器模式

1、装饰器模式(Decorator)可以动态地添加修改类的功能

2、一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法

3、使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性

迭代器模式

1、 迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。

2、 相比传统的编程模式,迭代器模式可以隐藏遍历元素的所需操作。

代理模式

1、 在客户端与实体之间建立一个代理对象(proxy),客户端对实体进行的操作全部委派给代理对象,隐藏实体的具体实现细节。

2、 Proxy还可以与业务代码分离,部署到另外的服务器,业务代码中通过RPC来委派任务。

面向对象编程的基本原则:

1、单一职责:一个类,只需要做好一件事,一个文件中最好只有一个类

2、开放封闭:一个类,应该是可扩展的,而不可修改的。

3、依赖倒置:一个类,不应该强依赖另一个类。每个类对于另外一个类都是可替换的。

4、配置化:尽可能地使用配置,而不是硬编码。

5、面向接口编程:只需要关心接口,不需要关心实现。

mvc结构

1、model:对数据库的操作

2、view:视图,例如模板文件

3、controller:逻辑层,实现业务逻辑部分

配置和设计模式

1、php中使用ArrayAccess实现配置文件的加载

2、在工厂方法中读取配置,生成可配置化对象

3、使用装饰模式实现权限验证,模板渲染,json串化

4、使用观察者模式实现数据跟新时间的一系列更新操作

5、使用代理模式实现数据库的主从自动切换

PHP魔术方法的使用:

1
2
3
4
__get/ __set   将对象的属性进行接管,访问/设置不存在的属性时
__call/ __callStatic 控制对象的方法调用,访问不存在的方法、静态方法时
__toString 将php对象转化为字符串
__invoke 将php对象当作一个函数来执行时会调用这个方法