Skip to content
/ GOF23 Public
forked from yezihack/GOF23

23种设计模式, golang代码实现

License

Notifications You must be signed in to change notification settings

xiiapp/GOF23

 
 

Repository files navigation

workflows

Go 设计模式

简称:GOF23

23种设计模式, Golang 代码实现

什么是设计模式

设计模式是软件设计中常见问题的典型解决方案,它们就像能根据需求进行调整制定的蓝图。它们能解决代码中反复出现的设计问题。

设计模式与库和方法不同,设计模式并不是一段特定的代码,而是解决特定问题的一般性概念。你可以根据模式来实现自己程序实际所 需解决方案

设计模式与算法:算法总是明确定义达成特定目标所需的一系列步骤,而模式则是对解决方案的更高层次描述。同一个模式在不同的程 序中实现代码可能不一样。

算法更像是菜谱:提供达以目标的明确步骤。

设计模型更是蓝图:你可以看到最终的结果和模式的功能,但需要自己确定实现步骤。

模式的历史

模式的概念是由克里斯托佛·亚历山大在其著作 《建筑模式语言》 中首次提出的。

埃里希·伽玛、 约翰·弗利赛德斯、 拉尔夫·约翰逊和理查德·赫尔姆这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。 该书提供了 23 个模式来解决面向 对象程序设计中的各种问题, 很快便成为了畅销书。 由于书名太长, 人们将其简称为 “四人组 (Gang of Four, GoF) 的书”, 并且很快进一步简化为 “GoF 的书”

设计模式的原则

众多设计原则,简称 SOLID 原则,参考:https://sgfoot.com/again-solid.html

单一职责原则(SRP)

经典定义:应该有且仅有一个原因引起”类“的变更。(不仅仅适应于类,还适应于方法,接口,函数等)

好处

  1. 类的复杂度降低,实现什么职责都有清晰明确的定义。
  2. 可读性提高,复杂性降低,那当然可读性提高了。
  3. 可维护性提高,可读性提高,那当然更容易维护了。
  4. 变更引起的风险降低。

核心

单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良。但是“职责”或“变化原因”都是不可度量的,因项目而异,因环境而异。

开闭原则(OCP)

经典定义:对修改关闭,对扩展开放。开闭原则是最基础的一个原则。其它原则精神领袖

注意

开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块的变 更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。

  1. 逻辑变化
  2. 子模块变化
  3. 可见视图变化

重要性

  1. 开闭原则对测试的影响
  2. 开闭原则可以提高复用性
  3. 开闭原则可以提高可维护性
  4. 面向对象开发的要求

里氏替换原则(LSP)

经典定义:父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常。使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行,有子类出现的地方,父类未必能适应。

好处

  1. 建立规则约束

核心

  1. 规则约束

迪米特原则(LKP)

经典定义:一个对象应该对其他对象有最少了解。

核心

  1. 类间解耦,弱耦合
  2. 只和朋友说话

接口隔离原则(ISP)

经典定义:客户端不应该依赖它不需要的接口。或类间依赖关系应该建立在最小的接口上。

核心

  1. 类间的依赖关系应该建立在最小的接口上
  2. 建立单一接口,不要建立臃肿庞大的接口

最佳实现

  1. 一个接口只服务于一个子模块或业务逻辑

接口倒置原则(DIP)

经典定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。

好处

  1. 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过 接口或抽象类产生的;
  2. 接口或抽象类不依赖于实现类;
  3. 实现类依赖接口或抽象类。

核心

  1. 精简的定义就是“面向接口编程”

依赖的三种写法

  1. 构造函数传递依赖对象
  2. Setter方法传递依赖对象
  3. 接口声明依赖对象

最佳实现

  1. 每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备
  2. 变量的表面类型尽量是接口或者是抽象类
  3. 任何类都不应该从具体类派生
  4. 尽量不要覆写基类的方法
  5. 结合里氏替换原则使用(父类出现的地方子类就能出现)

什么是倒置

依赖正置就是类间的依赖是实实在在的实现类间的依赖,也就是面向实现编程,这也是正常人的思维方式。

万物皆抽象,先有抽象再实现,即倒置。

如何学习设计模式?

  1. 设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。
  2. 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。

如何看懂 UML 图

UML

设计模式分类

创建型模式

创建型模式是提供创建对象的机制,增加已有的代码灵活性和复用性。

c1. 单例模式

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例

c2. 简单工厂模式

c3. 工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

c4. 抽象工厂模式

比较常见的模式

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

c5. 建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构型模式

介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。

行为模式

负责对象之间高效沟通和职责委派。

Reference

  1. 深入设计模式 https://refactoringguru.cn/design-patterns
  2. 图说设计模式 https://design-patterns.readthedocs.io/zh_CN/latest/index.html
  3. 设计模式之禅 https://book.douban.com/subject/25843319/
  4. 设计模式BLOG https://www.cnblogs.com/gupaoedu-tom/p/15549628.html

About

23种设计模式, golang代码实现

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%