简单记录下关于设计模式第一篇学习笔记。
设计模式的学习需要在工程中实践并思考,只看概念是永远不会懂的。
但是,学习设计模式,并不意味着迷信模式,照葫芦画瓢,而是要学习每种设计模式解决的问题,以及为什么这样要这样设计,以及这样设计的好与坏。现有设计模式不可能是所有问题的最优解,但至少能提供思路。
要学习的其实在遇到问题时,如何设计软件解决问题。
预备知识
- OOP: 类与对象,魔术方法,链式操作等。
- PSR 规范: 命名空间,自动载入类,单入口等等。
PHP 中可以使用
ArrayAccess
实现配置文件的加载。
三种基本设计模式
工厂模式
由工厂方法(专门的类)生成对象,而不是直接在代码中 new。
常见使用场景有:在工厂方法中读取配置,生成可配置化的对象。
单例模式
某个类的对象,在一次生命周期中,只允许创建一个。(比如数据库操作对象)
注册模式
全局共享和交换对象。
OOP 基本原则
单一职责
一个类,只需要做好一件事。
开放封闭
一个类,应该是可以被扩展的,但不可以被外界轻易修改的。
依赖倒置
一个类,不应该强依赖另一个类,每个类对另一个类的依赖都是可替换的。
具有依赖关系的两个类之间需要通过依赖注入的方式去实现,而不要直接在类里面使用另一个类。
可配置化
尽可能地使用配置,而不是硬编码。即,类与类之间的依赖关系最好是写到配置文件当中去,而不要在具体的类中定义或者引入。
面向接口编程
只需要关心接口,不需要关心实现。
MVC 设计结构
模型-视图-控制器,一种 C/S
,B/S
软件工程的组织方式。
模型
数据和存储的封装。
视图
展现层的封装。(如模版文件)
控制器
逻辑层的封装。
常用设计模式
适配器模式
可以将截然不同的函数接口封装成统一的 API。
常见使用场景有:
- PHP 的数据库操作扩展有
mysql
,mysqli
,pdo
3 种,可以用适配器模式统一成一致调用。 - 将
memcache
,redis
,file
,apc
等不同的缓存函数,统一成一致调用。
- PHP 的数据库操作扩展有
策略模式
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。
- 常见使用场景有:有一个电商网站,针对男女性用户各自跳转到不同的商品类目,并为其展示不同的广告。
使用策略模式可以实现 IoC,DI。
数据对象映射模式
是指将
对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
。
在代码中常见的应用场景比如,实现一个 ORM
类,将复杂的 SQL
语句映射成对象属性的操作。
观察者模式
是指当一个对象状态发生改变时,依赖它的对象全部回收到通知,并自动更新。
要实现一个事件发生后,要执行一连串的更新操作,传统的编程方式,就是在事件的代码后面直接加入处理逻辑。当更新的逻辑增多后,代码就变得难以维护。
这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
使用观察者模式后,可以实现低耦合,非侵入式的通知与更新机制。
- 常见使用场景有: 在观察者类中实现数据更新事件的一系列更新操作。
装饰器模式
指的是,可以动态地添加修改类的功能。
一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法。
使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
- 常见使用场景有: 在装饰器中实现权限验证,模版渲染,JSON 串化等。
迭代器模式
指的是,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。
相比于传统的编程模式,迭代器模式可以隐藏遍历元素所需要的操作。
代理模式
指的是,在客户端与实体之间,建立一个代理对象,客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节。所谓的实体指的是,数据库中的实体数据。
Proxy
还可以与业务代码分离,部署到另外的服务器。业务代码中通过 RPC 来委派任务。
- 常见使用场景有: 实现数据库的主从自动切换。