文章目录
- 面向对象(OO)设计原则(7)
- [创建型模式 (5)](#创建型模式 (5))
- [结构型模式 (7)](#结构型模式 (7))
- [行为型模式 (11)](#行为型模式 (11))



面向对象(OO)设计原则(7)

可维护性(Maintainability) ,可复用性(Reusability)
单一职责原则
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
开闭原则
软件实体应当对扩展开放,对修改关闭
里氏代换原则
所有引用基类的地方必须能透明地使用其子类的对象
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常:

继承重写的类应可使用:

cipher 密码
依赖倒转原则
高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
要针对接口编程

增加一个新的类型时需要修改源代码了,违背了开闭原则。

MainClass 依赖 抽象。
接口隔离原则
客户端不应该依赖那些它不需要的接口


这里三个Service可能差异特别大,比如openGL的片元着色器fshader,可能有的模型网格就没有纹理,有的不需要影子,这些网格就可以单独用一个着色器。🤓
合成复用原则
优先使用对象组合,而不是继承来达到复用的目的
自己留Operator
迪米特法则
应该尽量减少对象之间的交互
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
创建型模式 (5)
工厂方法模式 (类模式,其余都是对象模式)
有生产方法接口,具体内容由继承后重写决定。

当涉及到多个工厂和多个商品时,工厂方法模式通常会发展为抽象工厂模式。
抽象工厂模式
【不同厂子与相同产品】调用同样的类的方法<多态>

建造者模式
【车与造车】
产品本身与产品的创建过程解耦
原型模式
【拷贝用的函数】
复制 (深/浅)



单例模式
确保一个类只有一个实例

结构型模式 (7)
结构型模式(Structural Pattern)关注如何将现有类或对象组织在一起形成更加强大的结构。
类结构型模式 关心类的组合 【继承关系和实现关系】
对象结构型模式 关心类与对象的组合
适配器模式
【接口转换】
(包装器(Wrapper)模式)
桥接模式
【抽象与实现解耦】

形状与颜色两个维度。
组合模式
【树形结构】


(多叶子)
装饰模式
【动态增加职责】(比子类灵活)
拿到成员,可以调用他的所有方法;若有get方法,就能获取成员。
外观模式
【一组接口放一起调用】
<迪米特法则> 引入一个新的外观角色来降低原有系统的复杂
度


facade 外观
享元模式
【共享技术】
HashMap可作享元池,存在直接取,不存在再new.
代理模式
【由代理对象来控制对原对象的访问】


extends 扩展
同装饰模式一样,也是加一层。
不过装饰模式想增强功能,而这里是想加条件,而不是改变目标对象的行为。
装饰模式(Decorator) 与 代理模式(Proxy) 的根本区别
装饰模式的主要目的是增强或扩展对象的功能,动态地为对象增加额外的功能或行为。
代理模式的主要目的是控制对目标对象的访问,通常用于延迟加载、安全控制等,而不是改变目标对象的行为。
行为型模式 (11)
行为型模式(Behavioral Pattern) 关注系统中对象之间的交互。
类行为型模式 通过多态等方式来分配父类与子类的职责
对象行为型模式 通过对象关联等方式来分配两个或多个类的职责
解释器模式 (类模式)
解释器用定义的表示解释句子。

node 节点
模板方法模式(类模式)
基于继承的代码复用技术
抽象方法(Abstract Method)
具体方法(Concrete Method)
钩子方法(Hook Method) <插入点>挂接自定义代码
职责链模式
接收对象连接成一条链,沿着传递,直到有一个对象能够处理它为止。
successor 继承人。类成员维持了对下家的引用
命令模式
请求封装为对象
迭代器模式
又名游标(Cursor)模式
提供一种方法顺序访问一个聚合对象中的各个元素,且不用暴露该对象的内部表示。
由迭代器来提供遍历聚合对象内部数据的行为,简化聚合对象的设计,更符合单一职责原则

中介者模式
封装多对多交互。可以使对象之间的关系数量急剧减少。
QQ群
用户只需要将信息或文件发送到群中或上传为群共享文件即可,群的作用就是将发送者所发送的信息和文件转发给每一个接收者,将极大地减少系统中用户之间的两两通信。

colleague 同事
备忘录模式
快照。
originator 创始人
memento 纪念品
caretaker 管理员
观察者模式
一对多,状态改变通知。


假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程:
状态模式
状态改变时改变行为。
策略模式
算法封装,可替换
访问者模式
在不改变各元素的类的前提下定义新操作。