Maison  >  Article  >  développement back-end  >  Modèles de conception de fermeture dans les projets Golang

Modèles de conception de fermeture dans les projets Golang

王林
王林original
2024-04-16 16:33:02513parcourir

La fermeture est une technique qui lie une fonction à l'environnement variable auquel elle accède. Dans Golang, il est largement utilisé dans les modèles de conception tels que : Modèle d'usine : encapsule les méthodes d'usine et les données privées pour créer des types spécifiques d'objets. Modèle de stratégie : encapsule les méthodes de stratégie et les données privées pour basculer entre les algorithmes. Modèle d'observateur : encapsule les méthodes d'observateur et les données privées pour s'abonner à d'autres événements d'objet.

Modèles de conception de fermeture dans les projets Golang

Modèles de conception de fermeture dans les projets Golang

Introduction

Les fermetures sont une technique puissante qui lie une fonction et les variables auxquelles elle accède. Dans Golang, les fermetures sont largement utilisées pour améliorer la lisibilité, la réutilisabilité et la maintenabilité du code.

Qu'est-ce que la fermeture ?

Une fermeture se compose de deux parties :

  • Fonction imbriquée : Une fonction définie au sein d'une autre fonction.
  • Environnement variable : L'ensemble des variables accessibles par la fonction imbriquée, qui sont définies dans la portée externe de la fonction imbriquée.

Lorsqu'une fonction imbriquée est appelée, elle exécute non seulement son propre code, mais accède également à l'environnement variable auquel elle appartient. Ce comportement permet aux fermetures d'encapsuler des données privées tout en permettant aux fonctions externes d'accéder à ces données.

Fermetures dans les modèles de conception

Les fermetures peuvent être appliquées à une variété de modèles de conception dans les projets Golang, notamment :

  • Modèle d'usine : Méthodes d'usine utilisées pour créer des objets d'un type spécifique. Les fermetures peuvent encapsuler les méthodes d'usine et les données privées utilisées pour créer des objets.
  • Mode Stratégie : Mode pour basculer dynamiquement entre différents algorithmes. Les fermetures peuvent encapsuler des méthodes stratégiques et des données privées utilisées pour transmettre les paramètres de l'algorithme.
  • Modèle d'observateur : Utilisé pour permettre aux objets de s'abonner aux événements d'autres objets. Les fermetures peuvent encapsuler des méthodes d'observateur et des données privées utilisées pour transmettre des données d'événement.

Cas pratique : Factory Pattern

Ce qui suit montre un exemple du Factory Pattern implémenté à l'aide de fermetures :

package main

import (
    "fmt"
)

func main() {
    // 定义工厂函数,其中闭包封装了创建特定对象所需的私有数据。
    createAnimalFactory := func(animalType string) func() Animal {
        switch animalType {
        case "dog":
            return func() Animal { return &Dog{name: "Fido"} }
        case "cat":
            return func() Animal { return &Cat{name: "Whiskers"} }
        default:
            return nil
        }
    }

    // 创建不同的动物。
    dogFactory := createAnimalFactory("dog")
    dog := dogFactory()
    fmt.Println(dog)

    catFactory := createAnimalFactory("cat")
    cat := catFactory()
    fmt.Println(cat)
}

// Animal 接口定义了所有动物类型共享的方法。
type Animal interface {
    GetName() string
}

// Dog 类型实现了 Animal 接口。
type Dog struct {
    name string
}

func (d *Dog) GetName() string {
    return d.name
}

// Cat 类型实现了 Animal 接口。
type Cat struct {
    name string
}

func (c *Cat) GetName() string {
    return c.name
}

Dans cet exemple, la fermeture renvoie animalType 变量保存在其变量环境中,使 createAnimalFactory 函数可以根据不同的 animalType valeurs à différentes fonctions de création.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn