# design-pattern **Repository Path**: swordying/design-pattern ## Basic Information - **Project Name**: design-pattern - **Description**: 设计模式与面向对象原则 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-01-12 - **Last Updated**: 2024-03-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式与面向对象设计原则 - 英文:Dessign Pattern - 概念:面向对象编程的最佳实践 ## 1、设计模式分类 ### 1. 创建型模式 1. 工厂方法模式 Factory Method 2. 抽象工厂模式 Abstract Factory 3. 单例模式 Singleton 4. 建造者模式 Builder 5. 原型模式 Prototype ### 2. 结构型模式 1. 适配器模式 Adapter 2. 装饰器模式 Decorator 3. 代理模式 Proxy 4. 外观模式 Facade 5. 桥接模式 Bridge 6. 组合模式 Composite 7. 注册树模式 Registry ### 3. 行为型模式 1. 策略模式 Strategy 2. 模版方法模式 Template Method 3. 观察者模式 Observer 4. 迭代器模式 Iterator 5. 责任链模式 Chain Of Responsibility 6. 命令模式 Command 7. 备忘录模式 Memento 8. 状态模式 State 9. 访问者模式 Visitor 10. 中介者模式 Mediator 11. 解释器模式 Intepreter ## 1、工厂方法模式 1. 批量实例化类 2. 解决问题:快速实例化类 ## 2、抽象工厂模式 1. 创建一系列的类 2. 解决问题:动态增加新类而无需编写实例化代码 3. 关键点:编写可以无需指定的具体类且可以实例化的类 ## 3、单例模式 1. 一个类只实例化一次即可,例如数据库操作,只实例化一次数据库操作即可 2. 解决问题:减少类的创建 ## 4、建造者模式 1. 将一个复杂对象的构建与它的表示分离,使得代码可以创建一系列不同的表示,得以快速一致性展现 2. 优点:用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道 3. 用途:创建一些复杂的对象应该独立于该对象的组成部分以及它们的装配方法与顺序,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化 3. 参与对象:建造者基类、建造者类、建造者注入类指挥者 4. 作用:依赖注入、编程一致性 5. 目的:使类构建与它的对象展示分离 ## 5、原型模式 1. 先创建好一个原型对象,然后通过 clone 原型来创建 另一个 新的对象 2. 作用:复用实例化后对象的内存,适合大对象的创建,不仅复用了原类的数据结构、同事复用了原类数据的值 3. 与工厂模式作用类似,只不过是一族功能类似的类基于同一个原型链 4. 适用:功能性类的快速创建,复用原有类的一些属性;使得代码既复用了原来的类,又不会干扰或改变原来类 5. 参与对象:主体类、引用类、克隆节点 ## 6、适配器模式 1. 将一个类的接口转换成客户希望的另一个接口 2. 适用场景:适用一个已经存在的类,如果它的接口,不相同或者双方都不太容易修改时,可以考虑适用适配器模式 3. 分类:对象转换适配器模式、直接继承适配器模式 4. 备注:适配器模式是后期维护适用最多的模式,即 "亡羊补牢";或者资源不足时,动态增加更多的功能 ## 7、装饰器模式 1. 动态增加类的功能 2. 适用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性 3. 参与对象:被装饰类、装饰位点、装饰基类、装饰类 4. 其他作用:事件的运用、权限验证、模版渲染 ## 8、代理模式 1. 在客户端与远程实体之间建立一个代理对象,客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节 2. 适用场景:数据库读写分离代理;数据集中处理中心 3. 目的:控制对被代理对象的访问,保护被代理对象;扩展被代理对象;降低耦合度 4. 参与对象:客户端、服务端、中立层 ## 9、外观模式 1. 各个子系统的门面,为本系统的客户端提供各个子系统的功能,使子系统与客户端解耦 2. 适用常见:程序更新时使用门面,为各个复杂的系统编写接口 3. 参与对象:各个子系统,连接子系统的层-门面 4. 作用:降低耦合性、复杂度 ## 10、桥接模式 1. 将抽象与实现分离,是它们都可以独立变化 2. 目的:解决继承造成的类过大情况;相互作用的作用原因与变化目标解耦,使得其易于扩展 3. 适用场景:实现系统可能有多个角度分类,每一种都可能变化 4. 参与对象:实现类基类、实现类、抽象类基类、抽象类 5. 关键点:抽象类依赖实现类、针对抽象进行设计与编程 ## 11、组合模式 1. 将一个类分解成一系列方法一致的子类;将对象组合成为树形结构以表示 部分与整体 的层次结构。 2. 作用:根据不同的需求动态合成一个所需要的对象;使得用户对单个对象与多个组合一起的对象的使用具有一致性 3. 优点:高层模块调用简单;节点增加自由 4. 组成对象:抽象根节点、树枝节点基类、叶子节点基类、叶子实现类 ## 12、注册树模式 1. 单例模式与工厂模式的扩展模式 2. 解决问题:批量实例化且只实例化一次,集中管理类库 3. 扩展:也叫享元模式,运用共享技术有效地支持大量细粒度地对象 ## 13、策略模式 1. 面向一族功能一致的类编程,这些类开放统一的接口,其功能逻辑之间不相干扰 2. 关键:不同的策略类的抽象行为一致,即功能一致的一族类开放统一的方法 3. 解决问题:管理功能一致的模块,使其易于扩展、易于使用 4. 参与对象:接口类、实现类、调度类 5. 策略模式可以实现 依赖倒置、控制反转 ## 14、模版方法模式 1. 类继承的运用,多个子类共同协作的功能 2. 参与对象:父类、子类、共有方法、子类方法 3. 关键之处:公共方法父类实现、个性化方法在父类定义在子类实现 ## 15、观察者模式 1. 当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新 2. 参与对象:主体事件、观察者基类、观察者、观察台基类、观察台、观察位点 3. 解决问题:非侵入式编程、解耦 低耦合、易扩展 ## 16、迭代器模式 1. 在不了解内部实现的前提下,遍历一个聚合对象的内部元素 2. 作用:隐藏遍历元素的所需操作,无法一次获取迭代的对象 3. 需要继承 SPL 迭代器 Iterator 并实现 5 个接口 4. 关键之处:编程语言内部就已经实现了迭代器,无须使用此模式 ## 17、责任链模式 1. 多个功能一致对象都有相同的处理请求,并且这些对象可以形成一个按顺序执行的链条,请求在这些对象中传递,直到有一个对象处理它为止 2. 作用:避免请求的发送者和接收者之间的耦合关系 3. 参与对象:一族可以处理请求的对象、待处理的请求、处理请求与传递请求的节点 ## 18、命令模式 1. 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对一个事务的操作,模拟成一系列命令,顺序发出并执行命令 2. 参与对象:消费者、服务者、执行者、命令 3. 作用:在持续性的事务中,需要按照一定顺序的执行操作,命令模式就可以作为处理逻辑的模式 4. 关键:数据驱动,多线程、异步编程 ## 19、备忘录模式 1. 保存一个类在某一个节点时的实例对象 2. 参与对象:被备忘主体类、备忘录基类|备忘录实体类、备忘录管理类 3. 作用:可用于回滚与返回类初始化或者其它时刻的状态 ## 20、状态模式 1. 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了这个类 2. 作用:使得状态的逻辑判断转移到不同程度的一系列类当中,即简化逻辑判断 3. 参与对象:状态基类、状态类、状态变化管理节点 4. 使用场景:当一个对象的行为取决于它的状态,不同的状态有不同的行为时,就可以考虑使用状态模式 ## 21、访问者模式 1. 表示几族对象之间数据结构产生的操作关系,使用此模式解耦分离,使得增加新的数据关系变得容易 2. 作用:使数据结构与数据操作分离;稳定的数据结构与易变得操作耦合问题 3. 参与对象:访问者基类、访问者类、数据结构基类、数据结构类、访问者与数据结构管理类 4. 备注:适合用于数据结构相对稳定的系统;一般不需要访问者模式,一旦需要的时候,那就是真的需要了 5. 关键之处:访问者就是操作方法的抽象 ## 22、中介者模式 1. 用一个中介对象来封装一系列的对象交互,使个对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间地交互 2. 参与对象:中介者基类、中介者类、中介操作、其它需要中介的类 3. 优缺点:集中控制,慎重使用 ## 23、解释器模式 1. 当一个对象需要多个对象处理或者不确定哪个处理的时候,就可以使用解释器模式 2. 参与对象:解释器基类、解释器类、解释器管理类、待解释对象 3. 优点:容易修改和扩展文法 ## 附录:面向对象编程的基本原则 - 总原则:开闭原则 类可以扩展、但不可以修改 对于扩展是开放的、对于修改是封闭的 1. 单一职责原则:一个类有仅有一个引起它变化的原因 2. 里氏替换原则:任何基类可以出现的地方,子类一定可以出现 3. 依赖倒置原则:面向接口编程、而不是面向实现编程;一个方法应该遵从依赖于抽象而不是一个实例 4. 接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上 5. 迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类许需要调用另一个类的某一个方式时,可以通过第三方类转发这个调用 ## 其他设计模式学习地址 1. PHP 设计模式全集 https://learnku.com/docs/php-design-patterns/2018 2. 大话设计模式 https://www.imooc.com/learn/236 3. 菜鸟教程 https://www.runoob.com/design-pattern/design-pattern-tutorial.html