软考(系统架构师)-软件架构设计之设计模式

考题分析

设计模式主要会在基础知识部分考察,一是给你一个描述,让你选择用哪种设计模式;二是给你某个设计模式的图例,让你判断是哪个设计模式或者选择图中的某个部分,注意这些设计模式的英文也要熟记

设计原则

设计模式主要有七大原则,目的就是为了:降低对象之间的耦合,增加程序的复用性、扩展性和可维护性

开闭原则:软件实体(类、模块、方法)对扩展开放,对修改关闭。即新增功能时,通过 "扩展现有代码" 实现(比如新增子类、实现新接口),而不是修改原有代码

里氏替换原则:子类可以完全替换父类,且替换后程序行为不变

依赖倒置原则:一是高层模块不依赖低层模块,二者都依赖抽象(接口 / 抽象类);二是抽象不依赖细节,细节依赖抽象。即我们常说的"面向接口编程,而非面向实现编程"

单一职责原则:一个类 / 方法只负责一个职责(一个功能维度),不要承担过多职责

接口隔离原则:客户端不应该依赖它不需要的接口 ------ 将大接口拆分为多个小接口,每个接口只包含客户端需要的方法。即不要设计"万能接口"

迪米特法则:也称"最少知识原则",一个对象应该尽可能少地了解其他对象

合成复用原则:优先使用 "组合 / 聚合"(has-a),而非 "继承"(is-a)实现代码复用

设计模式

设计模式分成三类,分别为:创建型、结构型、行为型。

创建型

创建型主要用于创建对象,为设计类实例化新对象提供指南

抽象工厂模式(Abstract Factory):提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类

工厂方法模式(Factory Method) :定义一个创建对象的接口,但是由子类决定需要实例化哪一个类,工厂方法使得子类实例化的过程推迟

生成器模式(Builder):将一个复杂类的表示和构造分离,使得有相同的构建过程能够得到不同的表示

原型模式(Prototype):用原型实例指定创建对象的类型,并且通过复制这个原型来创建新的对象,允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建定义对象

单例模式(Singletion):保证一个类只有一个实例

结构型

结构型主要用于处理类和对象的组合,对类如何设计以形成更大的结构提供指南

适配器模式(Adaptor):将一个类的接口转换成用户希望得到的另一种接口,使原本不相容的接口得以协同工作

桥接模式(Bridge) :将类的抽象部分和实现部分分离出来,使它们可以独立变化

组合模式(Composite):将对象组合成树型结构以表示"整体-部分"的层次结构,使得用户对单个对象和组合对象的使用具有一致性

装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,提供了用子类扩展功能的一个灵活的替代,比派生一个子类更灵活

外观模式/门面模式(Facade) :定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化该子系统的使用

享元模式(Flyweight):用于减少创建对象的数量,以减少内存占用和提供性能,提供支持大量细粒度对象共享的有效方法

代理模式(Proxy):为其他对象提供一种代理以控制这个对象的访问

行为型

行为型主要用于描述类和对象的交互以及职责的分配,对类之间交互以及分配责任的方式提供指南

责任链模式(Chain of Responsibility):通过给多个对象处理请求的机会,减少请求的发送者和接收者之间的耦合,将接收对象链接起来,在链中传递的请求,直到有一个对象处理该请求

命令模式(Command) :将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作

解释器模式(Interpreter):给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子

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

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互,它使得各个对象不需要显式的相互调用,从而达到低耦合,还可以独立地改变对象间的交互

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

访问者模式(Visitor):表示一个作用于某个对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作

备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态

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

策略模式(Strategy):定义一系列算法,把它们一个个封装起来,并且使它们之间可以相互替换,从而让算法可以独立于使用它的用户而变化

模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法中的某些步骤

题目演练

2016年11月真题

  1. ()属于行为型模式

    A Decorator B Composite C Memento D Builder

  2. () 模式可以将一个复杂的组件分成功能性抽象和内部实现两个独立的但又相关的继承层次结构,从而可以实现接口和实现分离

    A Prototype B Flyweight C Adapter D Bridge

相关推荐
sanzk5 小时前
工厂方法模式
设计模式
大数据新鸟8 小时前
设计模式详解——外观模式
设计模式·外观模式
缘友一世9 小时前
PentestGPT V2源码研究之工具层设计模式
设计模式
yinghuoAI20269 小时前
电商视觉进入“无人区”:萤火AI如何用三把“手术刀”重构设计 workflow
设计模式·新媒体运营·产品运营·流量运营·用户运营·内容运营·设计规范
sg_knight10 小时前
设计模式实战:观察者模式(Observer)
python·观察者模式·设计模式
Whoami!10 小时前
⋐ 17-2 ⋑ 软考高项 | 第 23 章:组织通用管理 [ 下 ]
软考·高项·信息系统项目管理师·组织通用管理
猹叉叉(学习版)10 小时前
【系统分析师_知识点整理】 12.系统设计
笔记·软考·系统设计·系统分析师
Yu_Lijing12 小时前
基于C++的《Head First设计模式》笔记——MVC模式
c++·笔记·设计模式
无籽西瓜a12 小时前
【西瓜带你学设计模式 | 第十期 - 外观模式】外观模式 —— 子系统封装实现、优缺点与适用场景
java·后端·设计模式·软件工程·外观模式
han_12 小时前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式