encodery / go-patterns-cn

Golang 实现设计模式

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

设计模式之美

面向对象

  • 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
  • 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

封装、抽象、继承、多态

  1. 关于封装特性封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。封装特性存在的意义,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。

  2. 关于抽象特性封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。

  3. 关于继承特性继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类。为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持。继承主要是用来解决代码复用的问题。

  4. 关于多态特性多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类、duck-typing。多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。

贫血模型和充血模型

  • 贫血模型: 是指Model 中,仅包含状态(属性),不包含行为(方法),也就是没有业务逻辑,采用这种设计时,需要分离出DB层,专门用于数据库操作。
  • 充血模型:Model 中既包括状态,又包括行为,是最符合面向对象的设计方式。

设计模式的六大原则

单一职责原则 ( Single Responsibility Principle)

一个类或者模块只负责完成一个职责(或者功能)。一个类只负责完成一个职责或者功能。不要设计大而全的类,要设计粒度小、功能单一的类。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。

  • 如何判断类的职责是否足够单一
    • 类中的代码行数、函数或者属性过多;
    • 类依赖的其他类过多,或者依赖类的其他类过多;
    • 私有方法过多;
    • 比较难给类起一个合适的名字;
    • 类中大量的方法都是集中操作类中的某几个属性;

开闭原则 (Open Closed Principle)

软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。

简单理解就是 添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。

里式替换原则 (Liskov Substitution Principle)

子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。

接口隔离原则 ( Interface Segregation Principle)

使用者不应该被强迫依赖它不需要的接口。

依赖反转原则 (Dependency Inversion Principle)

高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。

所谓高层模块和低层模块的划分,简单来说就是,在调用链上,调用者属于高层,被调用者属于低层。

迪米特法则(Law Of Demeter)

个对象应该对其他对象保持最少的了解, 尽量避免依赖更多类型。

设计模式的分类

创建型模式

主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。

  • 单例模式用来创建全局唯一的对象。
  • 工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。
  • 建造者模式是用来创建复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象。
  • 原型模式针对创建成本比较大的对象,利用对已有对象进行复制的方式进行创建,以达到节省创建时间的目的。

结构型模式

结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题

结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式

行为型设计模式

行为型设计模式主要解决的就是“类或对象之间的交互”问题。

行为型设计模式包括:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

设计模式 Golang 实现

序号 名称
1 观察者模式
2 策略模式
3 模板方法模式
4 装饰模式
5 桥接模式
6 工厂模式
7 抽象工厂模式
8 原型模式
9 建造者模式
10 单例模式
11 享元模式
12 外观模式
13 代理模式
14 适配器模式
15 中介者模式
16 状态模式
17 备忘录模式
18 组合模式
19 迭代器模式
20 职责链模式
21 命令模式
22 访问器模式
23 解释器模式

About

Golang 实现设计模式