Ilvsx's Blog

return practice() ? '1 week' : 'never';

韩天峰的《大话 PHP 设计模式》学习笔记

视频地址:Rango - 大话PHP设计模式 - imooc.com

一、什么是设计模式

  • 什么是设计模式:前人的经验总结,如果把编程比作武林,那设计模式就是武林秘籍
  • 课程内容:
    • PHP 面向对象的高级特性
    • 十一种设计模式
  • 课程目标:
    • 掌握 PHP 各类设计模式
    • 具备设计纯面向对象框架和系统的能力

二、开发环境

  • Phpstorm
  • Source Code Pro 字体

三、命名空间

  • 作用和目的:解决命名冲突,方便管理代码
  • 实现
    • spl_autoload_register()
    • composer 自动生成

四、链式操作的实现

一行代码实现多行代码的功能

$db->where('name', 'sakuya')->where('sex', 1)->first();

关键是 return $this

五、PHP 魔术方法

  • __get/__set:属性接管
  • __call/__callstatic:控制方法调用
  • __toString:当对象被当作字符串时
  • __invoke:将对象当成一个函数执行的时候会回调

    <?php
    class CallableClass 
    {
        function __invoke($x) {
            var_dump($x);
        }
    }
    $obj = new CallableClass;
    $obj(5);
    var_dump(is_callable($obj));
    \\ int(5)
    \\ bool(true)
    

六、常见设计模式

工厂模式

用工厂方法或类来生成对象,而不是在代码中直接 new Class(),替换new Class() 这种写法
好处是如果生成对象的方式发生改变,比如构造参数改变,直接修改工厂方法就行了

单例模式

使某个类的对象只允许创建一个
比如数据库类,数据库的连接只需要连接一次

注册模式

解决全局变量共享问题和交换对象
可以理解成用一个类来存放全局变量

适配器模式

可以将截然不同的函数接口封装成统一的 API
比如多种数据库的连接方法不同,通过这个模式封装成统一的 API

策略模式

将一组特定的行为和算法封装成类,以适应某些特定的上下文环境

数据对象映射模式

将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
例子:ORM

观察者模式

当一个对象状态发生改变时,依赖它的对象全不会收到通知,并自动更新
场景:一个事件发生后,要执行一连串的更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑当更新的逻辑增多之后,代码变得难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码
观察者模式实现了低耦合、非侵入式的通知与更新机制

原型模式

  • 与工厂模式类似,都是用来创建对象
  • 与工厂模式不同的地方是,原型模式是先创建好一个原型对象,然后通过 clone 原型对象的方式,来创建新的对象,这样就免去了类创建时重复的初始化操作
  • 原型模式适用于大对象的创建创建一个大对象需要很大的开销,如果每次 new 就会消耗很大,原型模式仅需内存拷贝即可

装饰器模式(Decorator)

  • 可以动态地添加修改类的功能
  • 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现该类的方法
  • 使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可实现最大的灵活性

迭代器模式

在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素
实现 Iterator 接口即可

代理模式

在客户端和实体之间建立一个代理对象,客户端对实体的操作全部委派给代理对象,隐藏实体的具体实现细节

Newer >>