作业2:软件设计原则、设计模式
| 这个作业属于哪个课程 | 软件代码开发技术 |
|---|---|
| 这个作业要求在哪里 | 作业二链接 |
| 这个作业的目标 | 了解软件设计原则与设计模式 |
设计模式概述
- 设计模式是一种解决问题的思想,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
分类
按照范围:
- 类模式:用来处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时便确定下来了
- 对象模式:处理对象间的关系,这些关系在运行时是可以变化的,更加动态性
按照目的:
- 创建型模式:用来处理对象的创建过程
- 结构性模式:用来处理类或者对象的的组合
- 行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述
- 如图所示,共有23种经典设计模式
![image]()
几种常见的设计方法介绍
创建型模式
单例模式
- 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例
- 优点:
- 只有一个实例,节约内存资源。省去new操作符,降低了系统内存的使用频率
- 有些类例如核心交易的引擎,如果可以创建多个,那么可能会对系统造成混乱(比如一个军队出现了多个司令同时指挥,就可能造成混乱),所以使用单例模式更恰当
- 缺点:
- 没有抽象层,不能扩展(开闭原则)
- 职责过重,违背了单一性原则
工厂方法模式
- 建立一个工厂类,对实现了同一接口的一些类进行实例的创建
- 适合出现了大量产品需要创建,并且具有共同的接口
建造者模式
- 将各种产品集中起来进行管理,用来创建复合对象(工厂类模式提供的是创建单个类的模式),所谓复合对象就是指某个类具有不同的属性
结构型模式
组合模式
- 有时又叫部分-整体模式,在处理类似树形结构的问题时比较方便
- 使用场景:将多个对象组合在一起进行操作(例如一棵二叉树,其左右节点与当前对象类型是一致的)
外观模式
- 为了解决类与类之间的关系,像spring一样,可以将类和类之间的关系配置到配置文件中,
- 外观模式将关系放在一个Facade类中,降低了类类之间的耦合度,该模式没有涉及到接口
- 以计算机启动为例:
- 启动计算机需要cpu、内存、磁盘的启动
- 将cpu、内存、磁盘作为Facade类(电脑)的属性
- 最后由电脑统一对cpu等进行控制
代理模式
- 为某对象提供一种代理以控制该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
- 例如租房子的时候去找中介,因为中介对该地区房屋的信息掌握更加全面,这就是代理的体现
- 使用代理模式,可以将功能划分的更加清晰,有利于后期维护
- 当已有方法使用时需要对原有的方法进行改进:
- 使用代理类调用原有的方法,且对产生的结果进行控制
- 不推荐直接修改原有方法来适应,这样违反了“对扩展开放,对修改关闭的原则”
- 当已有方法使用时需要对原有的方法进行改进:
装饰者模式
- 给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
- 优点:
- 可以动态的为一个对象增加功能,而且还能动态撤销。(继承的功能是静态的,不能动态增删)
- 缺点:
- 产生过多相似的对象,不易排错!
行为型模式
模板方法模式
- 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
- 即:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用
策略模式
- 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户
- 需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数
- 策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可
设计模式的六大原则
1. 开闭原则
- 开闭原则就说对_扩展开放,对修改关闭_。
- 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果
- 概括就是:为了是程序的扩展性好,易于维护和升级。为了得到这种效果,通常使用接口和抽象类
2. 里氏代换原则
- 里氏代换原则是面向对象设计的基本原则之一,LSP中说任何基类可以出现的地方,子类一定可以出现。
- LSP是继承复用的基石,只有衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类上增加新的行为。
- 里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则就是对实现抽象化的具体步骤的规范。
3. 依赖倒置原则
- 开闭原则的基础,针对接口编程,依赖于抽象而不依赖于具体
- 简单地说就是要求针对抽象编程,而不要针对实现编程,这样就降低了客户与实现模块间的耦合
4. 接口隔离原则
- 使用多个隔离的接口,比使用单个接口要好,还是一个降低类之间的耦合度的意思
- 不同的角色就交给不同的接口处理
5. 迪米特法则
- 也叫最少知道原则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立
6. 单一职责原则
- 一个类,应该只有一个引起它变化的原因。即一个类中应该只有一个职责,如果一个类有一个以上的职责,那么这些职责就会耦合在一起。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责耦合在一起,会影响复用性。
博文编辑截图

参考资料
郑阿奇《软件秘笈:设计模式那点事》
参考链接-CSDN
百度百科


浙公网安备 33010602011771号