视频链接
一、设计模式
《设计模式:可敷用6面向对象软件的基础》这本书的其中四个作者,被称为四人组(Gang of Four),这本书也被称为“四人组(或GOF)”书。
设计模式的本质是面向对象设计原则的实际应用,是对类的封装性、继承性和多态性以及类的关系和组合关系的充分理解。
GOF反复向你强调一个宗旨:要让你的程序尽可能的可重用。
二、GoF的23种设计模式的分类和功能
1、根据目的来分
可以分为创建型模式、结构型模式和行为型模式3种。
创建型模式(5个)
用于描述“怎么样创建对象”,它的主要的特点是“将对象的创建与使用分离”。GoF中提供了单例、原型、工厂方法、抽象工厂、建造者等5种创建型模式。
结构型模式(7个)
用于描述如何将类或者对象按照某种布局组成更大的结构,GoF中提供了代理、适配器、桥接、装饰、外观、享元、组合等7种结构性模式。
行为型模式(11个)
用于描述类和对象之间怎么样相互协作共同完成单个对象都无法单独完成的任务,以及怎么样分配职责。GoF中提供模版方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等11种行为型模式。
2、根据作用范围来分
根据模式是主要用于类上还是主要用于对象来分,这种方式可分为类模式和对象模式两种。
类模式
用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译的时候便确定下来了,GoF中的工厂方法、(类)适配器、模版方法、解释器属于该模式。
对象模式
用于处理对象之间的关系,这些关系可以通过组合或者聚合来实现,在运行的时刻是可以变化的,更具有动态性。GoF中除了以上4种,其他的都是对象模式。
3、设计原则(7个,好记忆:里合接迪开依单)
里合接迪开依单
开闭原则
软件实体应该对扩展开放,对修改关闭。
这里的软件实体包括以下几个部分:
- 1、项目中划分出的模块
- 2、类与接口
- 3、方法
开闭原则的含义:当应用的需求改变的时候,在不改变软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
开闭原则的作用:
- 1、 对软件测试的影响
只有新的模块需要测试。 - 2、可以提高代码的可复用性
- 3、可以提高软件的可维护性
开闭原则的实现方法
可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
里氏替换原则(子类中尽量不要重写父类的方法)
继承必须确保超类所拥有的性质在子类中仍然成立。(不建议子类去重写父类的代码)
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承、什么时候不应该使用继承,以及其中蕴含的原理。
里氏替换原则作用
- 里氏替换原则是实现开闭原则的重要方式之一
- 它克服了继承中重写父类造成的可复用性变差的缺点
- 它是动作正确性的保证,即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
里氏替换原则实现方法
里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但是不能改变父类原有的功能。
下面的例子在重写了父类代码的时候,出现了问题
改进
依赖倒置原则(高层模块不应该依赖低层模块,二者都应该依赖其抽象)
高层模块不应该依赖于低层模块,两者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。
核心思想是面向接口编程,不是面向实现编程
依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
依赖倒置原则的作用
依赖导致原则的主要作用如下:
- 1、依赖倒置原则可以降低类之间的耦合性
- 2、依赖倒置原则可以提高系统稳定性
- 3、 依赖倒置原则可以减少并行开发引起的风险
- 4、依赖倒置原则可以提高代码的可读性和可维护性。
依赖导致原则的实现方法
依赖倒置原则的目的是通过面向接口的编程来降低类之间的耦合性。
- 1、每个类尽量提供接口或者抽象类,或者两者都具备
- 2、变量的声明类型尽量说接口或者是抽象类
- 3、任何类都不应该从具体类派生(尽量不要继承一个类)
- 4、使用继承时尽量遵循里氏替换原则
例子
单一职责原则(一个类应该只负责一项职责)
又称为单一功能原则,这里的指责是指类变化的原因,单一指责原则规定一个类应该有且只有一个引起它变化的原因,否则类应该被拆分。
单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
单一职责原则的实现方法
单一职责原则是最简单但是又最难运用的原则,需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模块中。而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。
例子
辅导员只负责生活方面,辅导员只负责学习方面。
注意:单一职责同样适用于方法,一个方法应该尽可能做好一件事情,如果一个方法处理的事情太多,其颗粒度会变得很粗,不利于重用。
接口隔离原则(一个类对另一个类的依赖应该建立在最小的接口上)
接口隔离原则要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。
- 客户端不应该被迫依赖于它不使用的方法。
- 一个类对另外一个类的依赖应该建立在最小的接口上。
以上两个定义的含义:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有的依赖它的类去调用。
单一职责原则和接口隔离原则的区别
接口隔离原则优点
接口隔离原则的实现方法
例子
迪米特法则(最小知识原则)
迪米特法则的实现方法
例子
合成复用原则
要求软件在复用的时候,尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
合成复用原则的实现方法
通过将原有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。
例子