作业二:读书笔记
这个作业属于哪个课程 | 软件代码开发技术 |
---|---|
这个作业要求在哪里 | 作业二 |
这个作业的目标 | 学习软件设计模式和原则 |
一、准备工作
名称 | 作者 | 链接 |
---|---|---|
《软件秘笈:设计模式那点事》(本文使用) | 郑阿奇 | 链接 |
《软件设计模式》 | 朱洪军 | 链接 |
二、归纳总结
什么是软件设计模式?
模式就是经验的总结。设计模式就是被反复使用,经过梳理总结的代码设计经验。使用设计模式的能够提高代码的可重用性,并且让程序更加安全可靠。
(资料图片)
软件设计的分类?
按目的分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或对象组合;行为型模式用来对类或对象怎么交互和怎样分配职责进行描述。
设计模式
创建型模式
- 工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对那个。
- 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
- 建造者模式:复杂对象的创建与表示分离同样的构建过程可以创建不同的表示。
- 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
- 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
结构型模式
- 适配器模式:将一个类的接口转换成客户希望的另外一个接口
- 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
- 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构
- 装饰者模式:动态地给一个对象添加一些额外的职责
- 外观模式:为子系统中的一组接口提供一个一致的界面
- 享元模式:运用共享技术有效地支持大量细粒度的对象
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问
行为型模式
责任链模式
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示
中介者模式:用一个中介对象来封装一系列的对象交互
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新
状态模式:允许一个对象在其内部状态改变时改变它的行为
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
访问者模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
(是书上定义)
设计模式六大原则
- 开-闭原则:对拓展开发,对修改关闭
- 单一职责原则:一个类只负责一个任务功能
- 依赖倒置原则:上下层不应该相互依赖,两者都应该依赖其抽象。细节依赖于抽象
- 接口隔离原则:接口中不存在派生类用不到却必须实现的方法
- 里式替换原则:使用父类的地方一定能用派生类,子类不能重写父类非抽象方法。
- 迪米特法则:尽量不要让实体类之间建立直接调用,最好通过其友元来建立中转关系。
三、心得体会
//结合自己曾经的软件开发实践,思考用到了哪些原则或模式?谈谈读书的心得体会。
这是leecode上得到一道题,给你一个整数数组 nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。在做题的时候我没有使用辅助函数。
class Solution {public: int findPeakElement(vector& nums) { int n = nums.size(); int l = 0, r = n - 1; if(n == 1||nums[0] > nums[1]){ //在峰值,直接输出 return 0; } if(nums[r - 1] < nums[r]){ //在峰值,直接输出 return r; } while(l < r){ int mid = (l + r + 1) / 2; if(nums[mid - 1] < nums[mid] && nums[mid] > nums[mid + 1]){ //在峰值,直接输出 return mid; } else if(nums[mid] < nums[mid + 1]){ //峰底或者上升,往右一定有峰 //在峰低往两边都行,智慧得随便选择了一遍 l = mid; } else if(nums[mid] > nums[mid + 1]){ //下降峰,往左一定有峰 r = mid - 1; } } return -1; }};
通过增加一个辅助函数,让函数的目标更清晰,代码编写也变得更加简洁。每个函数的职责更加单一,符合设计模式六大原则中的单一职责原则。
class Solution {public: int findPeakElement(vector& nums) { int n = nums.size(); // 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i]) // 方便处理 nums[-1] 以及 nums[n] 的边界情况 auto get = [&](int i) -> pair { if (i == -1 || i == n) { return {0, 0}; } return {1, nums[i]}; }; int left = 0, right = n - 1, ans = -1; while (left <= right) { int mid = (left + right) / 2; if (get(mid - 1) < get(mid) && get(mid) > get(mid + 1)) { ans = mid; break; } if (get(mid) < get(mid + 1)) { left = mid + 1; } else { right = mid - 1; } } return ans; }};
四、博文编辑界面截图
标签:
- 作业二:读书笔记
- 环球今亮点!2023年5月15日LME铅库存报32900吨
- 瑞安市缘缘工艺礼品厂_关于瑞安市缘缘工艺礼品厂介绍
- 我负债500万无力偿还了?该怎么办?_世界关注
- 国家邮政局发布《2022年邮票发行监管报告》_天天报资讯
- 邓孝慈分享青春感言,助力2023青年电影周(浙江)
- 每日消息!港股午后快速拉升
- 电脑插上音响没有声音怎么设置_电脑插上音响没有声音
- 比亚迪F3多少钱?比亚迪F3降价3万是真的吗?|新资讯
- 危险!宿松4名女学生“共享”一辆共享单车 今日关注
- 王庆章得莫利炖鱼哈西店地址(得莫利炖鱼做法)_独家
- 鼎泰高科:5月12日融资买入60.47万元,融资融券余额2843.35万元|世界即时看
- 生源地贷款一直不到账怎么办 情况是这样的
- 天天短讯!新安江山水画廊风景区_关于新安江山水画廊风景区简介
- 天天实时:云南省文山壮族苗族自治州砚山县2023-05-15 06:55发布大雾黄色预警
- [粘胶短纤]:粘胶短纤一周前瞻|焦点日报
- 时隔四年再夺西甲冠军,巴萨官推晒出球队更衣室合影
- 萌萌哒!哈登一袭粉装亮相抢七
- 客场之王,莱万代表巴萨最近13个进球中有11个在客场打进
- 【全球报资讯】携智行联盟股份认购慧智微,助力智能通信领域新生态
- 每天逾万名移民涌入 美国边境“形势完全失控” 环球快看
- 【环球播资讯】二年级下册总共有哪些古诗 二年级下册一共有多少个古诗?
- come back to me什么意思_comebacktome 全球观焦点
- 小事见格局,细节看人品!
- 热门看点:关于艾滋病的手抄报一年级_关于艾滋病的手抄报
- 当心!2毫克即可致命!近期已有多人因它进了ICU-当前快讯
- 【世界时快讯】促就业!南京仙林将岗位送到居民家门口
- 中国邮政储蓄个人网上银行,中国邮政储蓄个人网上银行怎么登录
- 天天动态:Epic表示虚幻引擎5.2已消除PSO引起的卡顿问题
- 中小城市应差异化做大文旅品牌-全球百事通