作业二:软件设计原则、设计模式
相关书籍/网站
- 《软件秘笈:设计模式那点事》—— 郑阿奇
- 《软件设计模式》—— 朱洪军
- 软件设计原则
一、设计原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据7条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。
设计原则 | 定义 | 优点 |
---|---|---|
开闭原则 | 一个软件实体应当对扩展开放,对修改关闭 | 提高软件系统的可复用性以及维护性 |
里氏替换原则 | 子类型必须能够替换它们的基类型。反过来的代换不成立 | |
依赖倒置原则 | ||
单一职责原则 | ||
接口隔离原则 | ||
迪米特原则 | 一个对象应该对其他对象保持最少的了解,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。 | |
合成复用原则 | 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现 | 可以使系统更加灵活,降低类与类之间的藕合度一个类的变化对其他类造成的影响相对较少 |
二、设计模式
是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
创建型模式
模式 |
概念 | 设计原则 |
使用场合 |
---|---|---|---|
工厂方法模式 | 定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建 | 开闭原则 依赖倒置原则 |
|
抽象工厂模式 | 提供一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体的实现类 | 开闭原则 | |
建造者模式 | 将复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示 | 分步骤创建复杂对象 构建和表示分离 单一职责原则 |
|
原型模式 | 用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象 | 考虑产生对象的复杂度和类复用 结合系统结构考虑使用浅复制还是深复制 |
|
单例模式 | 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 | 当在系统中某个特定的类对象实例只需要有一个的时候,可以使用单例设计模式。需要注意的是,只有真正有“单一实例”的需求时才可使用 |
结构型模式
模式 |
概念 | 设计原则 |
使用场合 |
---|---|---|---|
适配器模式 | 把一个类的接口转换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 | 使用对象组合,面向接口和抽象编程 开闭原则 |
|
桥接模式 | 使得软件系统能够轻松地沿着多个方向变化,而又不引入额外的复杂度。用意是“将抽象化与实现化脱耦,使得二者可以独立地变化” | 使用聚合关联,不使用继承关联 抽象化层次和实现化层次脱耦 |
|
组合模式 | 将对象组合成树形结构以表示“部分-整体”的层次结构 | 统一对待个别对象和组合对象 面向抽象编程 |
|
装饰者模式 | 在不改变原类文件和使用继承的情况下,动态地扩展一个对象的功能 | 装饰者和被装饰者完全隔离开来 对扩展开放,对修改关闭 面向抽象编程 优先使用对象组合 |
|
外观模式 | 为子系统中的一组接口提供一个统一的高层接口,使子系统更容易使用;通过一个外观接口读/写子系统中各接口的数据资源,而客户可以通过外观接口读取内部资源库,不与子系统产生交互 | 迪米特法则 将系统中可能发生变化的部分独立出来,进行封装 |
|
享元模式 | 以共享的方式高效地支持大量的细粒度对象,通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗 | 共享细粒度对象,降低内存空间 有效地隔离系统中的变化部分和不变部分 |
|
代理模式 | 两个对象参与处理同一请求,接收的请求由代理对象委托给真实对象处理,代理对象控制请求的访问 | 延迟加载,提高系统效率 单一职责原则 |
行为型模式
模式 |
概念 | 设计原则 |
使用场合 |
---|---|---|---|
责任链模式 | 很多对象由每一个对象对其下家的引用而连接起来形成一条链。客户端应用请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求 | 开闭原则 单一职责原则 |
|
命令模式 | 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;将请求排队或记录请求日志,支持可撤销的操作 | 开闭原则 迪米特法则 |
|
解释器模式 | 给定一个语言的文法表示,并且定义一个解释器,用来解释语言中的句子 | 开闭原则 将可能变化的部分封装在非终结符表达式中 |
|
迭代器模式 | 提供了一种模式顺序访问一个集合对象中的各个元素功能,而又不暴露其内部的表示 | 开闭原则 单一职责原则 |
|
中介者模式 | 用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显式地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系 | 一对多的对象依赖转化为一对一依赖 集中控制提高类的复用性 |
|
备忘录模式 | 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态 | 封装边界的保持 双重接口实现,保证安全性 |
|
观察者模式 | 又称为发布/订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 | 开闭原则 单一职责原则 依赖倒置原则 |
|
状态模式 | 当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类 | 开闭原则 单一职责原则 |
|
策略模式 | 定义一系列的算法,将每一种算法封装起来并可以相互替换使用,让算法独立于使用它的客户应用而独立变化 | 开闭原则 单一职责原则 |
|
模板方法模式 | 定义一个操作中的算法骨架,而将一些实现步骤延迟到子类当中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤 | 开闭原则 好莱坞原则 |
|
访问者模式 | 表示一个作用于某对象结构中的各元素的操作,它使用户可以在不改变各元素类的前提下定义作用于这些元素的新操作 | 开闭原则 单一职责原则 |
三、心得体会
刚开始接触软件编程的时候,我是把所有的代码都放在一个函数里面的。后来随着学习的深入,开始把代码分装,但由于没有规范地学习过软件设计原则和设计模式,我的代码分装不够合理,就拿我上学期做的数据库课设(代码被我删了,故无图)来说,虽然有意识地按照单例原则、单一职责原则、接口隔离原则来进行分包和封装,但有些地方还是做得不够好,而且当时也没有意识到使用软件设计模式来进行开发,故而这个课设在现在看来还是还是问题多多啊,以后的代码开发要好好地使用软件设计原则和设计模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?