软件设计模式期末知识点复习

本篇文章基于 程细柱主编的软件设计模式(Java版)一书的期末知识点总结复习。

复习内容根据学校期末试卷知识范围编写,并非涵盖整本书中的所有23种设计模式。

软件设计模式期末试卷分数组成:

        教材书后选择题 10分

        书后简答题 2x5分 = 10分

        程序分析题(如书P92-四) 2x10分 = 20分

        综合题(根据需求写代码或画出类图并回答问题) 2x20分 = 40分

        往届软考真题(程序代码填空)每题5空每空2分共10分 2x10分 = 20分

考试范围:抽象工厂模式、代理模式、适配器模式、装饰模式、外观模式、享元模式、组合模式、策略模式、职责链模式、观察者模式、中介者模式、迭代器模式。

一、定义

(1)抽象工厂模式

        为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

(2)代理模式

        由于某些原因需要给某对象提供一个代理以控制对该对象的访问。

(3)适配器模式

        将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

(4)装饰模式

        在不改变现有对象结构的情况下,动态地给该对象增加一些职责(额外功能)的模式。

(5)外观模式

        一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。

(6)享元模式

        运用共享技术来有效地支持大量细粒度对象的复用。

(7)组合模式

        将对象组合成树状的层次结构的模式,用来表示部分与整体的关系,使用户对单个对象和组合对象具有一致的访问性。

(8)策略模式

        定义并封装一系列算法,使得它们可以相互替换且算法的变化不会影响使用算法的客户。

(9)职责链模式

        避免请求发送者与处理者耦合,将所有请求连接成链,直到有对象处理为止。

(10)观察者模式:

        多个对象间存在一对多的依赖关系,当一个对象的状态发生改变,所有依赖于它的对象都得到通知并被自动更新。

(11)中介者模式

        定义一个中介对象去封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变他们之间的交互。

(12)迭代器模式:

        提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。

二、详细解释

抽象工厂模式:

  1. 工厂模式只生产一个等级的产品,抽象工厂可以生产多个等级的产品。
  2. 产品族:同一个具体工厂生产的一组不同等级的产品。
  3. 产品等级:同种类产品。
  4. 抽象工厂模式好处在于灵活修改产品类型而不需要修改客户端代码,增加程序灵活性。(客户端代表要求生产和接受产品的接口不变,可以通过修改工厂内部的生产具体代码而改变产出体现灵活)同时这一特性也决定了当需要给产品族中增加一个新的产品则所有工厂类的代码都需要进行修改。

关键字:产品生产 综合型 提供接口而无需指定具体类 一致性

代理模式:

  1. 代理模式可以理解为当不能直接调用对象时,创建一个中间对象去间接调用该对象,同时可以对本次调用加以修饰如加入预处理和后处理逻辑。
  2. 代理模式只有三个主要角色:
    1. 抽象主题类:定义需要访问的对象的接口。
    2. 真实主题类:对于接口的具体实现。
    3. 代理类:将需要代理访问的对象“包装”,以供间接调用。
  3. 动态代理:预先传入要访问的对象,予以动态创建,若存在则直接调用反正则先创建对象再代理调用。
  4. 代理模式可以扩展目标对象功能,与客户端进行分离,降低系统耦合度,但同时由于增加了一个代理对象,会使请求速度变慢增加了系统复杂度。
  5. 远程、虚拟、安全代理:
    1. 远程代理:客户端通过网络远程访问主机上的对象,隐藏网络细节,具备更好的灵活性与响应速度。
    2. 虚拟代理:对于一些占用系统资源较多或者加载时间较长的对象,可以给这些对象提供一个虚拟代理,一定程度上提高系统的性能。
    3. 安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

关键字:代理访问对象 间接 访问对象比较大 安全原因屏蔽客户端 中介

适配器模式:

  1. 适配器模式核心关键字:extends和implements.
    1. extends指向适配者类,包含了在调用此接口时执行的业务逻辑。
    2. implements指向目标接口,对于目标接口予以实现,业务逻辑为适配者类中所定义的逻辑。
  2. 适配器模式分为类适配器和对象适配器,前者采用多重继承关系,后者采用组合聚合关系。
  3. 适配器模式一般用于固定接口下不同对象的适配如书93页的综合题和书79页的发动机适配器例子。
  4. 适配器模式可以透明地调用目标接口并且复用现存类,解决接口不适配不一致的问题,但是更换适配器的具体实现过程较为复杂。

关键字:接口适配 兼容 组件复用 接口转换

装饰模式:

  1. 装饰模式就是高级继承模式,利用super函数继承父对象所有的特性,在此基础上进一步“装饰”,添加额外功能,可以与前面的“代理模式”对比理解。
  2. 装饰模式中的四个角色:抽象构件、具体构件、抽象装饰、具体装饰不是在任何时候都存在,某些环境下可以简化掉抽象角色,转而直接定义具体的对象,再对这一具体对象予以装饰。
  3. 装饰的目的是“扩展”,而不是继承的“填空”。
  4. 装饰模式增加了许多子类,过度使用会使程序变得很复杂。

关键字:扩展对象 包装对象 动态添加 动态撤销 额外功能

外观模式(迪米特法则):

  1. 通俗来说,外观模式就是将一系列功能子类打包成一个类,直接创建并调用这一个类来实现批量调用功能子类的目的,统一了对外的接口,不需要关注内部子系统的细节,降低程序复杂度,提高系统可维护性。
  2. 批量调用决定了不能很好地限制客户使用子系统类,同时如果要增加新的功能子类,可能需要修改总类也就是外观类或客户端的代码,违背“开闭原则”。

关键字:简化 统一接口 分离 简化细节 屏蔽子系统 降低耦合度

享元模式:

  1. 享元模式简单来说就是通过一个享元工厂,创建一个共享数组存储公共变量,若创建的变量已存在则直接取出,若不存在则将此变量存入共享数组中,同时创建一个享元对象存储这一变量,而非共享享元的通俗理解就是创建一个带有任意变量的“非共享享元”对象,这样这一非共享享元将变成这一对象的成员变量,接着将此对象传给享元对象,享元对象直接通过调用非享元对象的成员变量(也就是 对象.成员变量 的形式)来输出非享元信息。
  2. 享元模式的本质就是对象的成员变量的灵活运用,享元与非享元对象的区别就是一个受到共享变量数组控制,而另一个则是直接通过成员变量存储非共享数据。
  3. 享元模式应用于大量相同或者相似对象的情况下节省内存资源,有足够多的享元实例时才值得使用享元模式。
  4. 单纯享元模式就是删除了非共享享元这一对象,直接使用共享数组来控制所有享元对象。
  5. 复合享元模式的享元对象中不单单由共享变量组成,而是由一些单纯享元对象组成,也就是第4点中提到的。
  6. 享元模式增加了程序的复杂度,读取享元模式的外部状态会使得运行时间变长。

关键字:节约内存资源 大量相同或相似对象 对象复用 共享对象

组合模式:

  1. 组合模式的本质就是将叶子对象以数组的形式存储到树枝父对象中,通过循环遍历数组来调用叶子对象。
  2. 透明式与安全式的区别在于前者在接口中定义了子类的全部方法如Add( )、Remove( ),而后者只定义基本方法,具体的方法留给具体的子类去实现,可以避免由于返回null或者抛出异常而带来的安全性问题。
  3. 组合模式可以简化客户端代码,在组合体中加入新的对象不需要因此修改源代码,满足“开闭原则”。但是完成组合模式的设计较为复杂,需要花时间去理清其中的层次关系且不容易通过继承的方法来增加新功能。

关键字:部分-整体 一致访问 层次结构 透明式 安全式 树形结构

策略模式:

  1. 策略模式就是通过定义一系列算法类,通过环境类调用传入算法类中统一接口里实现的算法。这一模式的好处就是可以灵活的重用各种算法,同时也导致势必造成很多的算法类。
  2. 策略模式中各算法类彼此独立且对客户隐藏了算法实现细节,可以灵活调用算法类而不需要修改环境类,动态规划各类算法。

关键字:算法封装 多重条件语句 组织算法 隐藏算法细节 动态规划

职责链模式:

  1. 职责链模式中的责任链可以理解为传统if条件判断中的每一个if条件,将若干个条件单独封装成若干个“责任类”,将若干责任类连接成链,通过传入“请求”,也就是if条件判断中的参数,当这条链上有一个分支满足传入的参数,那么这个参数则交由这个责任类去处理。
  2. 将若干责任类连接成链通俗来说就是一个类的成员变量中可以存储下一个类的地址,也就是代码中 类.next 这一变量存储了当前责任类指向的下一个责任类的地址,当传入参数不符合当前条件的时候,则通过调用GetNext( )获取下一个责任类的地址,将参传入下一责任类进行判断,循环往复直到遇到满足条件的责任类去处理或者链上不存在满足条件的类为止。所以不能保证每个请求一定被处理,同时过长的职责链会导致系统性能受到影响,且会增加客户端的复杂性,错误的职责链设置会导致系统出错以及循环调用等问题。
  3. 职责链通俗理解为由若干责任类组成的if条件判断,只不过将条件分离单独封装成类而已。
  4. 职责链模式降低了对象之间的耦合度、增强了系统的可扩展性、增强了给对象指派职责的灵活性、简化了对象之间的连接、责任分担符合单一职责原则。

关键字:单一职责 隐藏请求处理细节与传递过程 避免发送与接收者耦合 多个对象处理请求 责任分担

观察者模式:

  1. 观察者模式通俗来说就是定义一个目标类和观察者类,将观察者类传入目标类以数组形式存储,目标类通过循环遍历数组中存储的观察者类来执行反应逻辑。
  2. 观察者模式降低了目标与观察者之间的耦合关系,但是二者之间的依赖关系并未完全接触,而且有可能出现循环引用。
  3. 当观察者对象很多时,通知会花费更多时间,影响程序的效率。

关键字:一对多 广播 发布-订阅模式 状态改变 事件监听 

中介者模式:

  1. 此模式核心依旧是利用公共数组存储类地址。定义一个中介类和两个同事类,初始化中介类时传入同事类存储于公共数组中,当同事类发送请求时,利用中介类转发请求,循环遍历数组中非自身的同事类(数组中总共就存在两个同事类)来接受请求。
  2. 中介者模式中用到了this关键字,也就是在传参时将自身类作为参数传入的意思;中介者类注册同事类同时在同事类内部也要声明中介者类。灵魂就是类的成员函数相互调用。
  3. 为了进一步简化可以省略抽象类的定义直接声明具体单例即可。
  4. 中介者模式的目的就是为了打通复杂对象之间的调用途径。当对象之间存在依赖混乱难以复用时,就可以定义一个中介者类来调用目标子类。
  5. 中介者模式降低了对象之间的耦合性,使得对象复用更加容易,提高系统灵活性便于维护和扩展。但只适用于较少同事类,太多会导致中介者职责范围变大,提高了系统复杂度以至于难以维护。

关键字:一对多转变一对一 对象解耦 中介对象 简化交互

迭代器模式:

  1. 迭代器模式的核心为聚合类和迭代器类。前者为聚合所有将要迭代的对象,后者为遍历聚合对象。
  2. 聚合类的核心为数组,定义一个成员数组存储或者移除传入的对象,在获取迭代器的时候将当前状态下的聚合数组传入并创建一个迭代器对象返回。
  3. 迭代器类基于收到的聚合器类传来的数组利用数组自带的get函数进行累加取值直到最后一项。
  4. 迭代器模式会隐藏聚合对象的内部表示且遍历任务交给迭代器类完成,专类专职。同时可以自定义不同方式的迭代器去遍历聚合类,新增聚合类与迭代器类都很方便,无须修改原有代码。
  5. 统一封装,方便调用。
  6. 唯一缺点是增加了类的个数,增加系统复杂度。

关键字:分离聚合对象的遍历行为 自定义遍历方式 隐藏聚合对象内部细节 统一遍历接口

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值