设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
GoF设计模式有23个,它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。根据它们的用途,设计模式可分为:
创建型模式(5种):提供创建对象的机制,提升已有代码的灵活性和可复用性
√ 常用:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式.
√ 不常用: 原型模式
结构型模式(7种):介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效
√ 常用:代理模式、桥接模式、装饰者模式、适配器模式.
√ 不常用:外观模式、组合模式、享元模式。
行为模式(11种):负责对象间的高效沟通和职责传递委派
√ 常用:观察者模式、模板模式、策略模式、责任链模式、迭代器模式、状态模式
√ 不常用:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
官方定义: 一个类或者模块只负责完成一个职责(或者功能)。
通俗解释: 一个类只负责完成一个职责或者功能。也就是说在类的设计中 我们不要设计大而全的 类,而是要设计粒度小、功能单一的类.
场景示例:
在一个社交媒体产品中,我们使用UserInfo去记录用户的信息,包括如下的属性.
如图所示 :
官方定义: 在面向对象编程领域中,开闭原则规定软件中的对象、类、模块和函数对扩展应该是 开放的,但对于修改是封闭的。这意味着应该用抽象定义结构,用具体实现扩展细 节,以此确保软件系统开发和维护过程的可靠性。
通俗解释: 对扩展开放,对修改关闭
优点:
1. 新老逻辑解耦,需求发生改变不会影响老业务的逻辑
2. 改动成本最小,只需要追加新逻辑,不需要改的老逻辑
3. 提供代码的稳定性和可扩展性
场景示例
系统A与系统B之间进行数据传输使用的是5269版本的协议,一年以后对5269版本的协议进行了修正。
请同学们用UML类图描述出上面需求中存在的: 类与类 类与接口之间的关系
开闭原则是所有的设计模式的最核心目标,顶层设计思维:
1.抽象意识
2.封装意识
3.扩展的意思
官方定义: 如果S是T的子类型,对于S类型的任意对象,如果将他们看作是T类型的对象,则对 象的行为也理应与期望的行为一致。
通俗解释: 1.当我的一个方法的参数是一个接口类型时,这个方法可以接收所有实现过这个接口的 实现类
2.在不了解派生类的情况下,仅通过接口或基类的方法,即可清楚的知道方法的行 为,而不管哪种派生类的实现,都与接口或基类方法的期望行为一致。
场景示例
在商城项目中,推出了三种促销方式:
1.满减活动,两百以上打八折
2.打折活动,全场九折
3.返现活动,消费超1000,返200.
请同学们设计一个结算接口及其实现类,该接口的结算方法能够对用户的最终消费金额进行一个计算.计算结果需要满足上面的多种促销方式.
官方定义: 一个类对另一个类的依赖应该建立在最小的接口上
通俗解释: 要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依 赖它的类去调用。
场景示例
需求: 后台管理系统要实现删除用户的功能,希望用户系统提供一个删除用户的接口,应该如何设计这个接口 ?
请同学们用UML类图描述出上面需求中存在的: 类与类 类与接口之间的关系
遵循接口隔离原则的优势
1.将胖接口分解成多个粒度小的接口,可以提高系统的灵活性和可维护行
2.使用多个专门的接口,还能够体现出对象的层次。
3.能够减少项目工程中的冗余代码.
官方定义: 是指在设计代码架构时,高层模块不应该依赖于底层模块,二者都应该依赖于抽 象。抽象不应该依赖于细节,细节应该依赖于抽象
通俗解释: 由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭 建起来的架构要比以细节为基础搭建起来的架构要稳定得多。
场景示例
假设我们现在要组装一台电脑,需要的配件有 cpu,硬盘,内存条。只有这些配置都有了,计算机才能正常的运行。cpu有很多选择,如Intel,AMD等,硬盘可以选择希捷,西数等,内存条可以选择金士顿,海盗船等。
依赖导致、依赖注入、控制反转这三者之间的区别与联系
官方定义: 迪米特法则又叫最少知识原则(LKP:Least Knowledge Principle ),指的是一个 类/模块对其他的类/模块有越少的了解越好。
通俗解释: 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必 要的接口。
场景示例
娱乐明星王冰冰由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。
我们只需关注三个常用的原则即可
(1 ) 单一职责原则: 单一职责原则是类职责划分的重要参考依据,是保证代码”高内聚“的有效手段,是我们在进行面向对象设计时的主要指导原则。
(2 ) 开闭原则: 开闭原则是保证代码可扩展性的重要指导原则,是对代码扩展性的具体解读。很多设计模式诞生的初衷都是为了提高代码的扩展性,都是以满足开闭原则为设计目的的。
(3 ) 依赖倒置原则依赖倒置原则主要用来指导框架层面的设计。高层模块不依赖低层模块,它们共同依赖同一个抽象。