设计模式
定义
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
分类
- 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
- 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
- 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。
统一建模语言
- 依赖关系 人 -- 手机 : 手机依赖人
- 关联关系 老师 -- 学生 : 老师和学生互相关联
- 聚合关系 学校 -- 老师 : 学校没了老师依然存在
- 组合关系 头 -- 嘴 : 头没了嘴就不存在了
- 泛化关系 人 -- 学生 : 继承关系,学生继承人
- 实现关系 车辆 -- 汽车 : 接口关系,汽车是车辆的实现
开闭原则
- 定义:扩展开放,对修改关闭
- 含义:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
- 作用: 对软件测试方便 可以提高代码的可复用性 可以提高软件的可维护性
里氏替换原则
- 定义:子类可以扩展父类的功能,但不能改变父类原有的功能。
- 事例:关于里氏替换原则的例子,最有名的是“正方形不是长方形”。当然,生活中也有很多类似的例子,例如,企鹅、鸵鸟和几维鸟从生物学的角度来划分,它们属于鸟类;但从类的继承关系来看,由于它们不能继承“鸟”会飞的功能,所以它们不能定义成“鸟”的子类。同样,由于“气球鱼”不会游泳,所以不能定义成“鱼”的子类;“玩具炮”炸不了敌人,所以不能定义成“炮”的子类等。
依赖倒置原则
- 定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
- 核心思想:要面向接口编程,不要面向实现编程。
- 目的:通过要面向接口的编程来降低类间的耦合性
单一职责原则
- 定义:一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
- 优点:控制类的粒度大小、将对象解耦、提高其内聚性。
接口隔离原则
- 定义:客户端不应该被迫依赖于它不使用的方法。一个类对另一个类的依赖应该建立在最小的接口上。
最少知识原则(迪米特法则)
- 定义:只与你的直接朋友交谈,不跟“陌生人”说话
- 含义:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
- 目的:降低类之间的耦合度,提高模块的相对独立性。
合成复用原则
- 定义:软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。
七个原则总结
这 7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
单例模式
-
定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
-
特点: 单例类只有一个实例对象 该单例对象必须由单例类自行创建 单例类对外提供一个访问该单例的全局访问点
-
实现 懒汉式单例:一开始不生成实例 饿汉式单例:一开始生成实例
建造者模式(Bulider模式)
1.定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示