第一章 设计模式概念
1. 设计模式
名词解释:一套被反复使用,多数人知晓,经过分类编目的优秀代码设计经验的总结。
作用:重用代码,使代码更易理解,保证代码的可靠性。
2. 可复用面向对象软件系统一般划分为两大类:应用程序工具箱、框架。
3. Java设计模式贯彻的原理:面向接口编程,而不是面向实现。
目标原则:降低耦合,增强灵活性。
4. 设计模式的要素
模式名称、问题、环境或初始环境、解决方案、效果、举例、末态环境、推理、其他有关模式、已知的应用。
5. 常用的设计模式有23种。
按特点分为三类:创建型,结构型,行为型。
6. 创建型模式
定义:用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其 关联对象的创建、组合和表达方式。
功能:将系统所使用的具体类的信息封装起来;隐藏类的实例是如何被创建和组织的。
作用:封装创建逻辑,不仅仅是new一个对象那么简单;封装创建逻辑变化,客户代码尽量不修改,或尽量少修改。
常见的创建型设计模式:
单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
7. 结构型模式
定义:类和对象的结构,它采用继承机制来组合接口或实现,或者通过组 合一些对象实现新的功能。
常见的结构型设计模式有:
代理模式、装饰模式、适配器模式、组合模式、桥梁模式、外观模式、享元模式。
8. 行为型模式
定义:关注的是对象的行为,用来解决对象之间的联系问题
常见的行为型设计模式有:
模板方法模式、命令模式、责任链模式、策略模式、迭代模式、中介者模式、 观察者模式、备忘录模式、访问者模式、状态模式、解释器模式
课后题:
1、 设计模式起源于:建筑工程设计
2、 下面不属于设计模式的要素的是:因素
3、 目前有23中设计模式,分为3大类
4、 设计模式分为创建型、结构型和行为型三大类型
第二章 设计原则
1.单一职责原则(SRP)
名词解释:一个类,只有一个引起它变化的原因,应该只有一个职责。
① 降低类的复杂性
② 提高类的可读性
③ 提高代码的可维护性和复用性
④ 降低因变更引起的风险。
作用:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口 或类设计是否优良,但“职责”和“变化原因”都是不可度量的。
2.里氏替换原则(LSP)
名词解释:所有引用基类的地方必须能透明地使用其子类对象,反之则不行。
优点:
① 代码共享,减少创建类的工作量。
② 提高代码可重用性
③ 提高代码的可拓展性
④ 提高产品或项目的开发性。
体现里氏替换原则的有如下几个模式:
策略模式、组合模式、代理模式
3.依赖倒置原则(DIP)
名词解释:高层模块不应该依赖低层模块,两者都应依赖其抽象,抽象不依赖细节,而细 节依赖抽象。
优点:
① 减少类间的耦合性
② 提高系统的稳定性,降低并行开发引起的风险。
③ 提高代码的可读性和可维护性。
作用:适用于大中型项目,是实现开闭原则的重要途径,依赖倒置原则没有实现,就不能 实现对扩展的开放,对修改关闭。
4.接口隔离原则(ISP)
名词解释:一个类对另外一个类的依赖性应当是建立在最小的接口上,使用多个专门的接 口比使用单一的总接口要好。
简述接口隔离原则:
① 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
② 一个借口代表一个角色,不应当将不同的角色都交给一个接口。
③ 不应该强迫客户依赖于它们不用的方法。
作用:只提供调用者需要的方法,屏蔽不必要的方法;带来了设计的灵活性,并降低了整 个项目的风险,当业务变化是能够快速应付。
5.迪米特法则(LoD)
名词解释:一个对象应当对其他对象尽可能少的了解。
作用:减少类之间的关系,降低类之间的耦合。
体现迪米特法则的设计模式有两个:外观模式、中介者模式
6.开闭原则(OCP)
名词解释:一个软件实体应当对扩展开放,对修改关闭。
优点:① 提高复用性 ② 提高可维护性 ③ 提高灵活性 ④ 易于测试
重要性:开闭原则是面向对象设计的终极目标,其他设计原则都可以看做是开闭原则的实 现方法。
1、 里氏替换原则简称:LSP
2、 关于单一职责原则描述错误的是:单一职责原则提高类之间的耦合性。(降低)
3、 关于依赖倒置原则描述错误的是:依赖倒置原则中,高层模块不应该依赖低层模块,但
低层模块依赖与高层模块。(都依赖于其抽象)
4、 设计模式中的六个主要原则包括:单一职责原则、里氏替换原则、依赖倒置原则、接口
隔离原则、迪米特法则和开闭原则。
5、 在设计模式中,对迪米特法则进行应用的设计模式有外观模式和中介者模式
第三章 创建型模式
1.单例模式:一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 在Java中有两种表现形式:饿汉式单例类;懒汉式单例类。
功能上分为:状态单例类;无状态单例类。
2.工厂方法模式:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
3.抽象工厂模式:工厂方法的升级,为创建一组相关或相互依赖的对象提供一个接口,而 且无需指定他们的具体类。
4.建造者模式:将一个复杂对象的构建与其表示分离,使同样的构建过程创建出不同的表示
5.原型模式:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
课后题:
1、 不属于创建型模式的是:策略模式
2、 关于单例模式说法错误的是:单例模式可以具有子类,并进行扩展。(单例模式无法创
建子类,扩展困难)
3、 关于工厂方法模式错误的是:工厂方法模式不可以与其他模式混合使用,不能进行扩展。
(可以与其他模式混合使用)
4、 关于抽象工厂模式说法正确的是:抽象工厂模式与工厂方法模式相似,也具有抽象工厂、
具体工厂、抽象产品和具体产品4个角色;抽象工厂模式是工厂方法模式的进一步抽象,针对的是一族产品
5、 简述建造者模式
将一个复杂对象的构建与其表示分离,使得同样的构建过程,可以创建不同的表示。
6、 简述原型模式
用原型实例指定创建对象的原型,创建新的对象
第四章 结构型模式
课后题:
1、属于结构型模式的是:代理模式、适配器模式、享元模式
2、关于装饰模式不正确的是:
装饰模式只有构件和装饰这两个角色(抽象构件角色、具体构件角色、、装饰角色、具体装饰角色)
3、关于适配器模式不正确的是:适配器模式简化了系统并提高系统的效率(对系统进行了扩展)
4、关于外观模式不正确的是:外观模式满足闭合原则(不满足)
5、简述桥梁模式和享元模式
桥梁模式:将抽象和实现解耦,使得两者可以独立的变化
享元模式:使用共享对象可有效的支持大量的细粒度的对象
第五章 行为型模式(1)
1、模板方法模式的优点:
① 封装不变的部分,扩展可变部分
② 提取公共部分代码,便于维护
③ 行为由父类控制,子类实现。
2、命令模式的优点:
① 类间解耦
② 可扩展性
③ 命令模式结合其他模式会更优秀。
3.责任链模式的优点:
① 将请求和处理分开 ② 提高系统的灵活性。
4策略模式的优点:
① 策略模式提供了管理相关的算法族的办法。
② 策略模式提供了可以替换继承关系的办法。
③ 使用策略模式可以避免使用多重条件转移语句。
5.迭代器模式的优点:
① 迭代器模式简化了访问容器元素的操作,具备一个统一的遍历接口。
② 封装遍历算法,使算法独立于聚集角色。
课后题:
1、不属于行为模式的是:工厂方法模式
2、关于模板方法模式说法错误的是:
模板方法模式破坏了开闭原则(符合开闭原则)
3、关于命令模式说法错误的是
命令模式包括命令和执行命令这两个角色(还有具体命令角色、接受者角色、调用者角色) 命令模式提高类之间的耦合性(降低)
4、关于策略模式说法错误的是:
策略模式只包括抽象策略和具体策略这两个角色(还有环境角色)
5、关于责任链模式说法错误的是:
责任链模式是一种不经常使用的行为模式(常见)
责任链模式提高了程序的性能且易于调试(降低性能,不易调试)
6、迭代器模式的4个角色分别是抽象迭代器、具体迭代器、抽象聚集和具体聚集。
第六章 行为型模式(2)
1.中介者模式:
名词解释:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显式地相互作 用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用场景:一个类依赖多个类的情况下,但并不是只要有依赖关系就考虑使用中介者模式。 类图: