结构型模式-桥接模式
结构型模式-桥接模式什么是桥接模式桥接是一种结构型设计模式, 可将一个大类或一系列紧密 相关的类拆分为抽象和实现 两个独立的层次结构,从而 能在开发时分别使用。
抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底 层实际工作的实现对象。
. 实现部分(Implementation)为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。抽象部分可以列出和实现部分一样的方法,但是抽象部分通 常声明一些复杂行为,这些行为依赖于多种由实现部分声明 的原语操作
具体实现(Concrete Implementations)中包括特定于平台的代码
精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互
通常情况下,客户端(Client)仅关心如何与抽象部分合作。 但是,客户端需要将抽象对象与一个实现对象连接起来
Example抽象package maintype Computer interface { Print() SetPrinter(Printer) ...
创建型模式-单例模式
创建型模式-单例模式什么是单利模式单例是一种创建型设计模式, 让你能够保证一个类只有一个实例,并提供一个访问该 实例的全局节点
单例模式,一个类只有一个实例
为该实例提供一个全局访问节点
单例(Singleton)类声明了一个名为 getInstance 获取实 例 的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端(Client) 代码隐藏。 调用 获取实例 方法必须是获取单例对象的唯一方式。
Example简单单例package mainimport ( "fmt" "sync")var lock = &sync.Mutex{}type single struct {}var singleInstance *singlefunc getInstance() *single { if singleInstance == nil { lock.Lock() defer lock.Unlock() ...
创建型模式-工厂方法
创建型模式-工厂方法什么是工厂方法工厂方法是一种创建型设计模式, 其在父类中提供一个创建对象的 方法,允许子类决定实例化对象 的类型
Example产品接口package maintype IGun interface { setName(name string) setPower(power int) getName() string getPower() int}
具体产品Apackage maintype Gun struct { name string power int}func (g *Gun) setName(name string) { g.name = name}func (g *Gun) getName() string { return g.name}func (g *Gun) setPower(power int) { g.power = power}func (g *Gun) getPower() i ...
创建型设计模式-抽象工厂
创建型设计模式-原型模式什么是原型模式原型是一种创建型设计模式,使 你能够复制已有对象,而又无需 使代码依赖它们所属的类
原型(Prototype)接口将对克隆方法进行声明。在绝大多数 情况下,其中只会有一个名为 clone 克隆 的方法
具体原型(Concrete Prototype)类将实现克隆方法。除了将 原始对象的数据复制到克隆体中之外,该方法有时还需处理 克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖 等等
客户端(Client)可以复制实现了原型接口的任何对象
原型注册表(Prototype Registry)提供了一种访问常用原型 的简单方法,其中存储了一系列可供随时复制的预生成对象。 最简单的注册表原型是一个 名称 → 原型 的哈希表。 但如 果需要使用名称以外的条件进行搜索,你可以创建更加完善 的注册表版本
Example原型接口package maintype Inode interface { print(string) clone() Inode}
具体原型Apackage mainimport &qu ...
创建型设计模式-抽象工厂
创建型设计模式-抽象工厂什么是抽象工厂它能创建一系列相关的对象,而无需指定其具体类
抽象产品:为构成系列产品的一组不同但 相关的产品声明接口
具体产品(Concrete Product)是抽象产品的多种不同类型实 现。所有变体(维多利亚/现代)都必须实现相应的抽象产品 (椅子/沙发
抽象工厂(Abstract Factory)接口声明了一组创建各种抽象 产品的方法
具体工厂(Concrete Factory)实现抽象工厂的构建方法。每 个具体工厂都对应特定产品变体,且仅创建此种产品变体。
尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就 不会与工厂创建的特定产品变体耦合。客户端(Client)只 需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/ 产品变体交互
Example抽象工厂接口package mainimport "fmt"type ISportsFactory interface { makeShoe() IShoe makeS ...
创建型设计模式-生成器模式
创建型设计模式-生成器模式什么是生成器模式使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象
生成器(Builder)接口声明在所有类型生成器中通用的产品 构造步骤
具体生成器(Concrete Builders)提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
产品(Products)是最终生成的对象。由不同生成器构造的 产品无需属于同一类层次结构或接口。
主管(Director)类定义调用构造步骤的顺序,这样你就可以 创建和复用特定的产品配置。
客户端(Client)必须将某个生成器对象与主管类关联。一 般情况下,你只需通过主管类构造函数的参数进行一次性关 联即可。此后主管类就能使用生成器对象完成后续所有的构 造任务。但在客户端将生成器对象传递给主管类制造方法时 还有另一种方式。在这种情况下,你在使用主管类生产产品 时每次都可以使用不同的生成器
Example生成器接口package maintype IBuilder interface { setWindowType() setDoorT ...
Gorm-JSON格式问题
Gorm-JSON格式问题概述在使用Gorm的时候,常常会使用JSON格式,但是JSON在Gorm的ORM中表达有着许多解析问题
问题描述
[]也是作为JSON格式的一种,里面可以切套object对象,但是实际上我们可以看作一个数组,这种时候
当我们使用
步骤建立表格type User struct { gorm.Model Name string Age int GameUser []GameUser `json:"game_user" gorm:"type:json"`}type GameUser struct { ID int Name string PassWord string}func main() { dsn := "root:123456@tcp(10.0.0.197:3303)/joohwan_dev?parseTime=true" mysqlDb, err := g ...
设计模式-五大原则
设计模式-五大原则职责单一原则尽量让每个类只负责软件中的一个功能,并将该功能完全封 装(你也可称之为隐藏)在该类中。
开闭原则对于扩展,类应该是“开放”的;对于修改,类则应 是“封闭”的。
里氏替换原则当你扩展一个类时, 记住你应该要能在不修改客户端 代码的情况下将子类的对象作为父类对象进行传递。
接口隔离原则客户端不应被强迫依赖于其不使用的方法。
依赖倒置原则高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。抽象接口不应依赖于具体实现。具体 实现应该依赖于抽象接口。
Gin中间件
Gorm:钩子HookHook 是在创建、查询、更新、删除等操作之前、之后调用的函数。
支持以下的Hook方法
type BeforeCreateInterface interface { BeforeCreate(*gorm.DB) error}type AfterCreateInterface interface { AfterCreate(*gorm.DB) error}type BeforeUpdateInterface interface { BeforeUpdate(*gorm.DB) error}type AfterUpdateInterface interface { AfterUpdate(*gorm.DB) error}type BeforeSaveInterface interface { BeforeSave(*gorm.DB) error}type AfterSaveInterface interface { Aft ...
Go-标准库日志Slog
Go的标准库日志Slog背景在Go1.21中,在Go的标准库函数中引入了Slog
据说使用的内存比Zap还要小
基础用法slog.Info("This is info log")slog.Warn("This is warning log")slog.Error("This is error log")日志输出:2024/07/23 15:26:01 INFO This is info log2024/07/23 15:26:01 WARN This is warning log2024/07/23 15:26:01 ERROR This is error log
输出参数的日志 name := "sss" slog.Info("msg", slog.String("name", name)) slog.Error("ERROR: value is empty", slog.Any("name", name)) 日志输出:20 ...