简称:GOF23
23种设计模式, Golang 代码实现
设计模式是软件设计中常见问题的典型解决方案,它们就像能根据需求进行调整制定的蓝图。它们能解决代码中反复出现的设计问题。
设计模式与库和方法不同,设计模式并不是一段特定的代码,而是解决特定问题的一般性概念。你可以根据模式来实现自己程序实际所 需解决方案
设计模式与算法:算法总是明确定义达成特定目标所需的一系列步骤,而模式则是对解决方案的更高层次描述。同一个模式在不同的程 序中实现代码可能不一样。
算法更像是菜谱:提供达以目标的明确步骤。
设计模型更是蓝图:你可以看到最终的结果和模式的功能,但需要自己确定实现步骤。
模式的概念是由克里斯托佛·亚历山大在其著作 《建筑模式语言》 中首次提出的。
埃里希·伽玛、 约翰·弗利赛德斯、 拉尔夫·约翰逊和理查德·赫尔姆这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。 该书提供了 23 个模式来解决面向 对象程序设计中的各种问题, 很快便成为了畅销书。 由于书名太长, 人们将其简称为 “四人组 (Gang of Four, GoF) 的书”, 并且很快进一步简化为 “GoF 的书”
众多设计原则,简称 SOLID 原则,参考:https://sgfoot.com/again-solid.html
经典定义:应该有且仅有一个原因引起”类“的变更。(不仅仅适应于类,还适应于方法,接口,函数等)
好处
- 类的复杂度降低,实现什么职责都有清晰明确的定义。
- 可读性提高,复杂性降低,那当然可读性提高了。
- 可维护性提高,可读性提高,那当然更容易维护了。
- 变更引起的风险降低。
核心
单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良。但是“职责”或“变化原因”都是不可度量的,因项目而异,因环境而异。
经典定义:对修改关闭,对扩展开放。开闭原则是最基础的一个原则。其它原则精神领袖
注意
开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块的变 更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。
- 逻辑变化
- 子模块变化
- 可见视图变化
重要性
- 开闭原则对测试的影响
- 开闭原则可以提高复用性
- 开闭原则可以提高可维护性
- 面向对象开发的要求
经典定义:父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常。使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行,有子类出现的地方,父类未必能适应。
好处
- 建立规则约束
核心
- 规则约束
经典定义:一个对象应该对其他对象有最少了解。
核心
- 类间解耦,弱耦合
- 只和朋友说话
经典定义:客户端不应该依赖它不需要的接口。或类间依赖关系应该建立在最小的接口上。
核心
- 类间的依赖关系应该建立在最小的接口上
- 建立单一接口,不要建立臃肿庞大的接口
最佳实现
- 一个接口只服务于一个子模块或业务逻辑
经典定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。
好处
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过 接口或抽象类产生的;
- 接口或抽象类不依赖于实现类;
- 实现类依赖接口或抽象类。
核心
- 精简的定义就是“面向接口编程”
依赖的三种写法
- 构造函数传递依赖对象
- Setter方法传递依赖对象
- 接口声明依赖对象
最佳实现
- 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
- 变量的表面类型尽量是接口或者是抽象类
- 任何类都不应该从具体类派生
- 尽量不要覆写基类的方法
- 结合里氏替换原则使用(父类出现的地方子类就能出现)
什么是倒置
依赖正置就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程,这也是正常人的思维方式。
万物皆抽象,先有抽象再实现,即倒置。
- 设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。
- 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。
创建型模式是提供创建对象的机制,增加已有的代码灵活性和复用性。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
比较常见的模式
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。
负责对象之间高效沟通和职责委派。