当前位置: 首页 > news >正文

13、设计模式总结

目录

13.1 一个目标

13.2 两种手段

13.3 八大原则

13.4 重构技法

13.5 从封装变化角度对模式分类

13.6 C++ 对象模型

13.7 关注变化点和稳定点

13.8 什么时候不用模式

13.9 经验之谈

13.10 设计模式成长之路




13.1 一个目标

  • 管理变化,提高复用!

13.2 两种手段

  • 分解 vs. 抽象

13.3 八大原则

  • 依赖倒置原则(DIP)
  • 开放封闭原则(OCP)
  • 单一职责原则(SRP)
  • Liskov 替换原则(LSP)
  • 接口隔离原则(ISP)
  • 对象组合由于类继承
  • 封装变化点
  • 面向接口编程

13.4 重构技法

  • 静态 -> 动态
  • 早绑定 -> 晚绑定
  • 继承 -> 组合
  • 编译时依赖 -> 运行时依赖
  • 紧耦合 -> 松耦合

13.5 从封装变化角度对模式分类

  • 组件协作:
    • Template Method
    • Observer / Event
    • Strategy
  • 单一职责:
    • Decorator
    • Bridge
  • 对象创建:
    • Factory Method
    • Abstract Factory
    • Prototype
    • Builder 【注:不是很常用】
  • 对象性能:
    • Singleton
    • Flyweight
  • 接口隔离:
    • Façade
    • Proxy
    • Mediator 【注:不是很常用】
    • Adapter
  • 状态变化:
    • Memento 【注:不是很常用】
    • State
  • 数据结构:
    • Composite
    • Iterator 【注:不是很常用】
    • Chain of Resposibility 【注:不是很常用】
  • 行为变化:
    • Command 【注:不是很常用】
    • Visitor 【注:不是很常用】
  • 领域问题:
    • Interpreter 【注:不是很常用】

13.6 C++ 对象模型

image-20211219131404423
继承和组合对象在C++对象模型上来说,都是B嵌入到A的内存中,且在A的内存的前面部分,A和B紧耦合,且B对象不具有灵活性,是不可变的;而第三种的组合一个指针就具有灵活性,指针指向的对象是可变的。

所有的模式最终都是通过指针指向多态对象来表达灵活性。

指针指向多态对象变成了松耦合对象模型的基础。

13.7 关注变化点和稳定点

image-20211221145219708

13.8 什么时候不用模式

  • 代码可读性很差时
  • 需求理解还很浅时
  • 变化没有显现时
  • 不是系统的关键依赖点
  • 项目没有复用价值时
  • 项目将要发布时

13.9 经验之谈

  • 不要为模式而模式
  • 关注抽象类 & 接口
  • 理清变化点和稳定点
  • 审视依赖关系
  • 要有Framework 和 Application 的区隔思维
  • 良好的设计是演化的结果

13.10 设计模式成长之路

  • “手中无剑,心中无剑”:见模式而不知
  • “手中有剑,心中无剑”:可以识别模式,作为应用开发人员使用模式
  • “手中有剑,心中有剑”:作为框架开发人员为应用设计某些模式
  • “手中无剑,心中有剑”:忘掉模式,只有原则

相关文章:

  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • 无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv
  • Mysql数据备份(mysqldump的操作)
  • 面向对象编程技术从0总结——“让你对基础技术有一个新的认识”(国庆五万字总结)
  • Spring Webflux - 01 MVC的困境
  • 自动登录禅道和自动开Bug(JMeter中HTTP Cookie管理器和HTTP请求默认值的用法)
  • 【Day23】力扣:LeetCode算法刷题 [927. 三等分 ] [415. 字符串相加]
  • 芯动科技面试——数字IC/FPGA面试案例总结1
  • [SpringMVC] SSM整合-前后台协议联调
  • DOM操作.操作元素内容
  • 【Java SE】String类
  • 数据可视化看板:基于 Echarts + Python Flask 动态实时大屏
  • 5道真题训练|学会了二叉树的前世今生
  • python专区--时间模块
  • 36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • CSS实用技巧干货
  • js
  • leetcode386. Lexicographical Numbers
  • leetcode46 Permutation 排列组合
  • Nodejs和JavaWeb协助开发
  • scala基础语法(二)
  • SpingCloudBus整合RabbitMQ
  • WebSocket使用
  • 闭包,sync使用细节
  • 测试如何在敏捷团队中工作?
  • 动态魔术使用DBMS_SQL
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 规范化安全开发 KOA 手脚架
  • 聚类分析——Kmeans
  • 前嗅ForeSpider教程:创建模板
  • 如何胜任知名企业的商业数据分析师?
  • 无服务器化是企业 IT 架构的未来吗?
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # Panda3d 碰撞检测系统介绍
  • #微信小程序:微信小程序常见的配置传值
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (C++20) consteval立即函数
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (转)c++ std::pair 与 std::make
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core Swagger 过滤部分Api
  • .Net FrameWork总结
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net中ListT 泛型转成DataTable、DataSet
  • .php文件都打不开,打不开php文件怎么办
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)