这个作业属于哪个课程 | 软件代码开发技术 |
---|---|
这个作业要求在哪里 | 作业二 |
这个作业的目标 | 学习软件设计模式和原则 |
名称 | 作者 | 链接 |
---|---|---|
《软件秘笈:设计模式那点事》(本文使用) | 郑阿奇 | 链接 |
《软件设计模式》 | 朱洪军 | 链接 |
模式就是经验的总结。设计模式就是被反复使用,经过梳理总结的代码设计经验。使用设计模式的能够提高代码的可重用性,并且让程序更加安全可靠。
(资料图片)
按目的分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或对象组合;行为型模式用来对类或对象怎么交互和怎样分配职责进行描述。
责任链模式
命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示
中介者模式:用一个中介对象来封装一系列的对象交互
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新
状态模式:允许一个对象在其内部状态改变时改变它的行为
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
访问者模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
(是书上定义)
//结合自己曾经的软件开发实践,思考用到了哪些原则或模式?谈谈读书的心得体会。
这是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; }};