设计模式
设计模式
设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率
设计原则
设计原则 | 简单说明 |
---|---|
单一职责 | 一个类只负责一项职责 |
里氏替换原则 | 子类可以扩展父类的功能,但不能改变父类原有的功能 |
依赖倒置原则 | 要依赖于抽象,不要依赖于具体,核心思想是==面向接口编程== |
接口隔离原则 | 建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少 |
迪米特法则 (最少知道原则) | 一个对象应该对其他对象保持最少的了解 |
开闭原则 | 对扩展开放,对修改关闭 |
分类
创建型
类型 | 图例 | 业务场景 | 实现要点 |
---|---|---|---|
单例 | 7种单例模式案例,Effective Java 作者推荐枚举单例模式 | 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 | |
工厂方法 | 多种类型商品不同接口,统一发奖服务搭建场景 | 定义⼀个创建对象的接口,让其子类⾃⼰决定实例化哪一个工⼚类,⼯厂模式使其创建过程延迟到子类进行。 | |
抽象工厂 | 替换 Redis双集群升级,代理类抽象场景 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 | |
建造者 | 各项装修物料组合套餐选配场景 | 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表 | |
原型 | 上机考试多套试,每人题目和答案乱序排列场景 | 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 |
行为型
这类模式负责对象间的高效沟通和职责委派。
类型 | 图例 | 业务场景 | 实现要点 |
---|---|---|---|
责任链 | 模拟618电商大促期间,项目上线流程多级负责人审批场景 | 避免请求发送者与接收者耦合在一起,让多对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 | |
命令 | 模拟高档餐厅八大菜系,小二点单厨师烹饪场景 | 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 | |
迭代器 | 模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景 | 提供一种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部表示。 | |
中介者 | 按照 Mybatis原理手写ORM框架,给JDBC方式操作数据库增加中介者场景 | 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 | |
备忘录 | 模拟互联网系统上线过程中,配置文件回滚场景 | 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 | |
观察者 | 模拟类似小客车指标摇号过程,监听消息通知用户中签场景 | 定义对象间的一种一对多的依赖关系,当个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 | |
状态 | 模拟系统营销活动,状态流程审核发布上线场景 | 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 | |
策略 | 模拟多种营销类型优惠券,折扣金额计算策略场景 | 定义一系列的算法把它们一个个封装起来并且使它们可相互替换。 | |
模板方法 | 模拟爬虫各类电商商品,生成营销推广海报场景 | 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 | |
访问者 | 模拟家长与校长,对学生和老师的不同视角信息的访问场景 | 主要将数据结构与数据操作分离。 |
结构型
这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。
类型 | 图例 | 业务场景 | 实现要点 |
---|---|---|---|
适配器 | 从多个MQ消息体中,抽取指定字段值场景 | 将一个类的接口转换成客户希望的另外个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 | |
桥接 | 多支付渠道(微信、支付宝)与多支付模式(刷脸、指纹)场景 | 将抽象部分与实现部分分离,使它们都可以独立的变化。 | |
组合 | 营销差异化人群发券决策树引擎搭建场景 | 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性 | |
装饰 | SSO单点登录功能扩展,增加拦截用户访问方法范围场景 | 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。 | |
外观 | 基于 Spring Boot开发门面模式中间件,统一控制接口白名单场景 | 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 | |
享元 | 基于 Redis秒杀,提供活动与库存信息查询场景 | 运用共享技术有效地支持大量细粒度的对象。 | |
代理 | 模拟 mybatis-springt中定义DAO接口,使用代理类方式操作数据库原理实现场景 | 为其他对象提供一种代理以控制对这对象的访问。 |