结构型模式-享元模式
结构型模式-享元模式什么是享元模式享元是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中 载入更多对象 享元模式只是一种优化。在应用该模式之前,你要确定程序 中存在与大量类似对象同时占用内存相关的内存消耗问题, 并且确保该问题无法使用其他更好的方式来解决 . 享元(Flyweight)类包含原始对象中部分能在多个对象中共 享的状态。同一享元对象可在许多不同情景中使用。享元中 存储的状态被称为“内在状态”。传递给享元方法的状态被 称为“外在状态“ 情景(Context)类包含原始对象中各不相同的外在状态。情 景与享元对象组合在一起就能表示原始对象的全部状态。 通常情况下,原始对象的行为会保留在享元类中。因此调用 享元方法必须提供部分外在状态作为参数。但你也可将行为 移动到情景类中,然后将连入的享元作为单纯的数据对象 客户端(Client)负责计算或存储享元的外在状态。在客户 端看来,享元是一种可在运行时进行配置的模板对象,具体 的配置方式为向其方法中传入一些情景数据参数 享元工厂(Flywei...
结构型模式-适配器模式
结构型模式-适配器模式什么是适配器模式适配器是一种结构型设计模式, 它能使接口不兼容的对象能够 相互合作 客户端(Client)是包含当前程序业务逻辑的类 客户端接口(Client Interface)描述了其他类与客户端代码 合作时必须遵循的协议 服务(Service)中有一些功能类(通常来自第三方或遗留系 统)。客户端与其接口不兼容,因此无法直接调用其功能 适配器(Adapter)是一个可以同时与客户端和服务交互的 类:它在实现客户端接口的同时封装了服务对象。适配器接 受客户端通过适配器接口发起的调用,并将其转换为适用于 被封装服务对象的调用。 Example客户端1234567891011package mainimport "fmt"type Client struct {}func (c *Client) InsertLightningConnectorIntoComputer(com Computer) { fmt.Println("Client inserts Lightning connec...
结构型模式-组合模式
结构型模式-组合模式组合模式组合是一种结构型设计模式, 你可以使用它将对象组合成 树状结构,并且能像使用独立对象一样使用它们 组件(Component)接口描述了树中简单项目和复杂项目所 共有的操作 叶节点(Leaf)是树的基本结构,它不包含子项目。 一般情况下,叶节点最终会完成大部分的实际工作,因为它 们无法将工作指派给其他部分。 容器(Container)——又名“组合(Composite)”——是包含叶 节点或其他容器等子项目的单位。容器不知道其子项目所属 的具体类,它只通过通用的组件接口与其子项目交互。容器接收到请求后会将工作分配给自己的子项目,处理中间 结果,然后将最终结果返回给客户端 客户端(Client)通过组件接口与所有项目交互。因此,客 户端能以相同方式与树状结构中的简单或复杂项目交互 Example组件接口12345package maintype Component interface { search(string)} 组合12345678910111213141516171819package mainimport &...
结构型模式-桥接模式
结构型模式-桥接模式什么是桥接模式桥接是一种结构型设计模式, 可将一个大类或一系列紧密 相关的类拆分为抽象和实现 两个独立的层次结构,从而 能在开发时分别使用。 抽象部分(Abstraction)提供高层控制逻辑,依赖于完成底 层实际工作的实现对象。 . 实现部分(Implementation)为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。抽象部分可以列出和实现部分一样的方法,但是抽象部分通 常声明一些复杂行为,这些行为依赖于多种由实现部分声明 的原语操作 具体实现(Concrete Implementations)中包括特定于平台的代码 精确抽象(Refined Abstraction)提供控制逻辑的变体。与其父类一样,它们通过通用实现接口与不同的实现进行交互 通常情况下,客户端(Client)仅关心如何与抽象部分合作。 但是,客户端需要将抽象对象与一个实现对象连接起来 Example抽象123456package maintype Computer interface { Print() SetPrinter(P...
创建型模式-单例模式
创建型模式-单例模式什么是单利模式单例是一种创建型设计模式, 让你能够保证一个类只有一个实例,并提供一个访问该 实例的全局节点 单例模式,一个类只有一个实例 为该实例提供一个全局访问节点 单例(Singleton)类声明了一个名为 getInstance 获取实 例 的静态方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端(Client) 代码隐藏。 调用 获取实例 方法必须是获取单例对象的唯一方式。 Example简单单例123456789101112131415161718192021222324252627282930package mainimport ( "fmt" "sync")var lock = &sync.Mutex{}type single struct {}var singleInstance *singlefunc getInstance() *single { if singleInstance == nil ...
创建型模式-工厂方法
创建型模式-工厂方法什么是工厂方法工厂方法是一种创建型设计模式, 其在父类中提供一个创建对象的 方法,允许子类决定实例化对象 的类型 Example产品接口12345678package maintype IGun interface { setName(name string) setPower(power int) getName() string getPower() int} 具体产品A12345678910111213141516171819202122package 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...
创建型设计模式-抽象工厂
创建型设计模式-原型模式什么是原型模式原型是一种创建型设计模式,使 你能够复制已有对象,而又无需 使代码依赖它们所属的类 原型(Prototype)接口将对克隆方法进行声明。在绝大多数 情况下,其中只会有一个名为 clone 克隆 的方法 具体原型(Concrete Prototype)类将实现克隆方法。除了将 原始对象的数据复制到克隆体中之外,该方法有时还需处理 克隆过程中的极端情况,例如克隆关联对象和梳理递归依赖 等等 客户端(Client)可以复制实现了原型接口的任何对象 原型注册表(Prototype Registry)提供了一种访问常用原型 的简单方法,其中存储了一系列可供随时复制的预生成对象。 最简单的注册表原型是一个 名称 → 原型 的哈希表。 但如 果需要使用名称以外的条件进行搜索,你可以创建更加完善 的注册表版本 Example原型接口123456package maintype Inode interface { print(string) clone() Inode} 具体原型A1234567891011...
创建型设计模式-抽象工厂
创建型设计模式-抽象工厂什么是抽象工厂它能创建一系列相关的对象,而无需指定其具体类 抽象产品:为构成系列产品的一组不同但 相关的产品声明接口 具体产品(Concrete Product)是抽象产品的多种不同类型实 现。所有变体(维多利亚/现代)都必须实现相应的抽象产品 (椅子/沙发 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象 产品的方法 具体工厂(Concrete Factory)实现抽象工厂的构建方法。每 个具体工厂都对应特定产品变体,且仅创建此种产品变体。 尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就 不会与工厂创建的特定产品变体耦合。客户端(Client)只 需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/ 产品变体交互 Example抽象工厂接口1234567891011121314151617181920package mainimport "fmt"type ISportsFactory interface &...
创建型设计模式-生成器模式
创建型设计模式-生成器模式什么是生成器模式使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象 生成器(Builder)接口声明在所有类型生成器中通用的产品 构造步骤 具体生成器(Concrete Builders)提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。 产品(Products)是最终生成的对象。由不同生成器构造的 产品无需属于同一类层次结构或接口。 主管(Director)类定义调用构造步骤的顺序,这样你就可以 创建和复用特定的产品配置。 客户端(Client)必须将某个生成器对象与主管类关联。一 般情况下,你只需通过主管类构造函数的参数进行一次性关 联即可。此后主管类就能使用生成器对象完成后续所有的构 造任务。但在客户端将生成器对象传递给主管类制造方法时 还有另一种方式。在这种情况下,你在使用主管类生产产品 时每次都可以使用不同的生成器 Example生成器接口12345678910111213141516171819package maintype IBuilder interface {...
Gorm-JSON格式问题
Gorm-JSON格式问题概述在使用Gorm的时候,常常会使用JSON格式,但是JSON在Gorm的ORM中表达有着许多解析问题 问题描述 []也是作为JSON格式的一种,里面可以切套object对象,但是实际上我们可以看作一个数组,这种时候 当我们使用 步骤建立表格12345678910111213141516171819202122type 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?par...



