首页 > 滚动 > > 内容页

作业二:读书笔记

时间:2023-05-15 17:19:51 来源:博客园
这个作业属于哪个课程软件代码开发技术
这个作业要求在哪里作业二
这个作业的目标学习软件设计模式和原则

一、准备工作

名称作者链接
《软件秘笈:设计模式那点事》(本文使用)郑阿奇链接
《软件设计模式》朱洪军链接

二、归纳总结

什么是软件设计模式?

​模式就是经验的总结。设计模式就是被反复使用,经过梳理总结的代码设计经验。使用设计模式的能够提高代码的可重用性,并且让程序更加安全可靠。


(资料图片)

软件设计的分类?

​按目的分,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式用来处理对象的创建过程;结构型模式用来处理类或对象组合;行为型模式用来对类或对象怎么交互和怎样分配职责进行描述。

设计模式

  • 创建型模式

    1. 工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对那个。
    2. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
    3. 建造者模式:复杂对象的创建与表示分离同样的构建过程可以创建不同的表示。
    4. 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
    5. 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
  • 结构型模式

    1. 适配器模式:将一个类的接口转换成客户希望的另外一个接口
    2. 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
    3. 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构
    4. 装饰者模式:动态地给一个对象添加一些额外的职责
    5. 外观模式:为子系统中的一组接口提供一个一致的界面
    6. 享元模式:运用共享技术有效地支持大量细粒度的对象
    7. 代理模式:为其他对象提供一种代理以控制对这个对象的访问
  • 行为型模式

    1. 责任链模式

    2. 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作

    3. 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

    4. 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示

    5. 中介者模式:用一个中介对象来封装一系列的对象交互

    6. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

    7. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新

    8. 状态模式:允许一个对象在其内部状态改变时改变它的行为

    9. 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换

    10. 模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

    11. 访问者模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

      (是书上定义)

设计模式六大原则

  1. 开-闭原则:对拓展开发,对修改关闭
  2. 单一职责原则:一个类只负责一个任务功能
  3. 依赖倒置原则:上下层不应该相互依赖,两者都应该依赖其抽象。细节依赖于抽象
  4. 接口隔离原则:接口中不存在派生类用不到却必须实现的方法
  5. 里式替换原则:使用父类的地方一定能用派生类,子类不能重写父类非抽象方法。
  6. 迪米特法则:尽量不要让实体类之间建立直接调用,最好通过其友元来建立中转关系。

三、心得体会

//结合自己曾经的软件开发实践,思考用到了哪些原则或模式?谈谈读书的心得体会。

这是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;    }};

四、博文编辑界面截图

x 广告
猜你喜欢