首页 > 其他分享 >代码设计-工厂化模式

代码设计-工厂化模式

时间:2023-05-23 13:31:59浏览次数:29  
标签:task return err 代码 JSON 模式 工厂化 error gin

第一版本

每个资源的每个方法都是分开的

资源和资源是分开的

资源的方法和资源的方法也是不相干的

示例中涉及的资源是 task和service

代码设计-工厂化模式_工厂模式

package main

import (
	"github.com/gin-gonic/gin"
)

// task结构体
type Task struct {
	Name        string
	Description string
}

// 定义task需要的方法
type TaskRegistry struct {
}

func (t *TaskRegistry) ListTasks() ([]Task, error) {
	return []Task{{
		Name:        "task",
		Description: "task test",
	}}, nil
}

func (t *TaskRegistry) CreateTask(task Task) error {
	return nil
}

// service结构体
type Service struct {
	Name        string
	Description string
}

// 定义service需要的方法
type ServiceRegistry struct {
}

func (s *ServiceRegistry) ListServices() ([]Service, error) {
	return []Service{{
		Name:        "service",
		Description: "service test",
	}}, nil
}

func (s *ServiceRegistry) CreateService(task Service) error {
	return nil
}

// task API 处理函数
func createTaskHandler(c *gin.Context) {
	var task Task
	if err := c.ShouldBindJSON(&task); err != nil {
		c.JSON(400, gin.H{"error": "Bad Request"})
		return
	}
	taskRegistry := TaskRegistry{}
	err := taskRegistry.CreateTask(task)
	if err != nil {
		c.JSON(500, gin.H{"error": "Failed to create task"})
		return
	}

	c.JSON(201, gin.H{"message": "Task created successfully"})
}

func listTasksHandler(c *gin.Context) {

	taskRegistry := TaskRegistry{}
	tasks, err := taskRegistry.ListTasks()
	if err != nil {
		c.JSON(500, gin.H{"error": "Failed to list tasks"})
		return
	}

	c.JSON(200, tasks)
}

// service API 处理函数
func listServicesHandler(c *gin.Context) {
	serviceRegistry := ServiceRegistry{}
	services, err := serviceRegistry.ListServices()
	if err != nil {
		c.JSON(500, gin.H{"error": "Failed to list tasks"})
		return
	}

	c.JSON(200, services)
}

func createServicesHandler(c *gin.Context) {
	var service Service
	if err := c.ShouldBindJSON(&service); err != nil {
		c.JSON(400, gin.H{"error": "Bad Request"})
		return
	}
	ServiceRegistry := ServiceRegistry{}
	err := ServiceRegistry.CreateService(service)
	if err != nil {
		c.JSON(500, gin.H{"error": "Failed to create service"})
		return
	}

	c.JSON(201, gin.H{"message": "Service created successfully"})
}

func main() {
	// 初始化 Gin Web 框架
	r := gin.Default()

	// 注册 API 路由
	r.POST("/tasks", createTaskHandler)
	r.GET("/tasks", listTasksHandler)
	r.GET("/services", listServicesHandler)
	r.POST("/services", createServicesHandler)

	// 启动 Web 服务器
	r.Run(":8080")
}

第二版本

抽象资源

task和service都属于资源,那么对待资源应该有统一的处理方式,只需要区分不同的资源执行相应资源的方法就行

代码设计-工厂化模式_工厂模式_02

package main

import (
	"github.com/gin-gonic/gin"
)

// task结构体
type Task struct {
	Name        string
	Description string
}

// 定义task需要的方法
type TaskRegistry struct {
}
func (t *TaskRegistry) ListTasks() ([]Task, error) {
	return []Task{{
		Name:        "task",
		Description: "task test",
	}}, nil
}
func (t *TaskRegistry) CreateTask(task Task) error {
	return nil
}

// service结构体
type Service struct {
	Name        string
	Description string
}
// 定义service需要的方法
type ServiceRegistry struct {
}
func (s *ServiceRegistry) ListServices() ([]Service, error) {
	return []Service{{
		Name:        "service",
		Description: "service test",
	}}, nil
}
func (s *ServiceRegistry) CreateService(task Service) error {
	return nil
}

func main() {
	// 初始化 Gin Web 框架
	r := gin.Default()
	// 注册 API 路由
	//r.POST("/tasks", createTaskHandler)
	//r.GET("/tasks", listTasksHandler)
	//r.GET("/services", listServicesHandler)
	//r.POST("/services", createServicesHandler)
	r.Any("/resource/:type", restHandler)

	// 启动 Web 服务器
	r.Run(":8080")
}

func restHandler(c *gin.Context) {
	resourceType := c.Param("type")

	switch resourceType {
	case "task":
		if c.Request.Method == "GET" {
			taskRegistry := TaskRegistry{}
			tasks, err := taskRegistry.ListTasks()
			if err != nil {
				c.JSON(500, gin.H{"error": "Failed to list tasks"})
				return
			}
			c.JSON(200, tasks)
		} else if c.Request.Method == "POST" {
			var task Task
			if err := c.ShouldBindJSON(&task); err != nil {
				c.JSON(400, gin.H{"error": "Bad Request"})
				return
			}
			taskRegistry := TaskRegistry{}
			err := taskRegistry.CreateTask(task)
			if err != nil {
				c.JSON(500, gin.H{"error": "Failed to create task"})
				return
			}

			c.JSON(201, gin.H{"message": "Task created successfully"})
		}
	case "service":
		if c.Request.Method == "GET" {
			serviceRegistry := ServiceRegistry{}
			services, err := serviceRegistry.ListServices()
			if err != nil {
				c.JSON(500, gin.H{"error": "Failed to list tasks"})
				return
			}

			c.JSON(200, services)
		} else if c.Request.Method == "POST" {
			var service Service
			if err := c.ShouldBindJSON(&service); err != nil {
				c.JSON(400, gin.H{"error": "Bad Request"})
				return
			}
			ServiceRegistry := ServiceRegistry{}
			err := ServiceRegistry.CreateService(service)
			if err != nil {
				c.JSON(500, gin.H{"error": "Failed to create service"})
				return
			}

			c.JSON(201, gin.H{"message": "Service created successfully"})
		}
	}

}




标签:task,return,err,代码,JSON,模式,工厂化,error,gin
From: https://blog.51cto.com/landandan/6330972

相关文章

  • C# 常用设计模式有哪些
    原文地址:C#常用设计模式有哪些-C#入门教程-.NET果糖网(donet5.com)C#中常用的设计模式有很多,以下列举几个常用的:1.工厂模式(FactoryPattern)通过工厂方法创建对象,隐藏对象的实例化过程,提供灵活性和可扩展性。1publicinterfaceIAnimal2{3voidSpeak();4......
  • Colab将加入AI写代码功能,或许将大幅度提高编码效率
         Ai技术的应用比较广泛,而近日谷歌的一款工具的发布,也意味着Ai技术被应用在编码领域。据悉,谷歌推出一款名为Colab的应用工具,值得一提的是,这款工具当中引入AI写代码功能。该功能由全新的「文生代码」模型Codey提供支持,支持20多种编码语言,包括Go、谷歌标准SQL、Ja......
  • 母函数详解(定义,模板代码,用法)
    本篇文章前半部分的母函数定义及讲解,和后面的题目推荐,在数学中,某个序列的母函数(Generatingfunction,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝......
  • JPEG编码协议--代码实现
      通过前面几篇的JPEG编码原理和文件格式解析,此篇通过简单的sample代码来具体介绍下JPG有损编码的简单实现,具体的说明见代码注释,改bmp2jpg.c实现了BMP图片到JPG图片的格式转换,使用gcc./bmp2jpg.c-std=c99-lm编译,执行。1#include<stdint.h>2#include<stdlib.h>......
  • Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队
    导读DeferredComponents,官方实现的Flutter代码动态下发的方案。本文主要介绍官方方案的实现细节,探索在国内环境下使用DeferredComponents,并且实现了最小验证demo。读罢本文,你就可以实现Dart文件级别代码的动态下发。一、引言DeferredComponents是Flutter2.2推出的功能,依赖于......
  • 低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!
    客户背景概述浙江广播电视集团(以下简称浙江台)是一家以广播电视为主业,兼营相关产业的综合媒体集团,是国内最具影响力的省级媒体之一。因新业务拓展需要,浙江台也需随之上线一套全新的媒资平台系统进行运营支撑,而新业务上线时间节点已迫近,项目组(10人)需要在10天内即完成新媒资平台系统......
  • JAVA设计模式之责任链模式
    文章目录一、责任链(ChainofResponsibility)模式二、责任链模式的结构三、源码四、纯的与不纯的责任链模式五、总结一、责任链(ChainofResponsibility)模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发......
  • Git拉取代码报错:Can't Update No tracked branch configured for branch dev or the b
    错误: 解决方法:第一步:gitpullorigin(远程仓库名称)develop(远程分支名称)--allow-unrelated-histories第二步:gitbranch--set-upstream-toorigin(远程仓库名称)/develop(远程分支名称)dev(本地分支名称)显示如下则为成功,可正常拉取代码 ......
  • python之禅 代码规范
    触发方法:在python解释器中输入importthis Python之禅byTimPeters() 优美胜于丑陋(Python以编写优美的代码为目标)明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)复杂胜于凌乱(如果复杂不可避免,那代码间......
  • 代码修改的git命令提交过程
    首先,克隆远程仓库到本地:gitclone<remote_repository_url>进入本地仓库目录:cd<local_repository_directory>创建并切换到一个新分支:gitcheckout-b<new_branch_name>修改代码并保存更改。添加修改后的文件到暂存区:gitadd<file_name>提交更改到本......