使用Golang实现开发中常用的【实例设计模式】

使用Golang实现开发中常用的【实例设计模式】

设计模式是解决常见问题的模板,可以帮助我们提升思维能力,编写更高效、可维护性更强的代码。

单例模式:

描述:确保一个类只有一个实例,并提供一个全局访问点。
优点:节省资源,避免重复创建对象。
缺点:单例对象通常是全局可访问的,容易引起耦合。

package singletonimport ("sync"
)type Singleton struct {value string
}var instance *Singleton
var once sync.Oncefunc GetInstance() *Singleton {once.Do(func() {instance = &Singleton{}})return instance
}func (s *Singleton) SetValue(value string) {s.value = value
}func (s *Singleton) GetValue() string {return s.value
}

工厂模式:

描述:提供一个创建对象的接口,但由子类决定实例化哪一个类。
优点:将对象的创建和使用分离,提高代码的灵活性。
缺点:增加了代码的复杂性。

package factorytype Product interface {Use()
}type ConcreteProductA struct{}func (p *ConcreteProductA) Use() {println("Using ConcreteProductA")
}type ConcreteProductB struct{}func (p *ConcreteProductB) Use() {println("Using ConcreteProductB")
}type Factory interface {CreateProduct() Product
}type ConcreteFactoryA struct{}func (f *ConcreteFactoryA) CreateProduct() Product {return &ConcreteProductA{}
}type ConcreteFactoryB struct{}func (f *ConcreteFactoryB) CreateProduct() Product {return &ConcreteProductB{}
}

观察者模式:

描述:定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知。
优点:实现了对象之间的松耦合。
缺点:如果观察者数量过多,通知过程可能会变得复杂。

package observertype Subject interface {RegisterObserver(observer Observer)RemoveObserver(observer Observer)NotifyObservers()
}type Observer interface {Update(data string)
}type ConcreteSubject struct {observers []Observerstate     string
}func (s *ConcreteSubject) RegisterObserver(observer Observer) {s.observers = append(s.observers, observer)
}func (s *ConcreteSubject) RemoveObserver(observer Observer) {for i, obs := range s.observers {if obs == observer {s.observers = append(s.observers[:i], s.observers[i+1:]...)break}}
}func (s *ConcreteSubject) NotifyObservers() {for _, observer := range s.observers {observer.Update(s.state)}
}func (s *ConcreteSubject) SetState(state string) {s.state = states.NotifyObservers()
}type ConcreteObserver struct {name string
}func (o *ConcreteObserver) Update(data string) {println(o.name, "received:", data)
}

策略模式:

描述:定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。
优点:算法的变化独立于使用算法的客户。
缺点:增加了代码的复杂性。

package strategytype Strategy interface {Execute(data string) string
}type Context struct {strategy Strategy
}func (c *Context) SetStrategy(strategy Strategy) {c.strategy = strategy
}func (c *Context) ExecuteStrategy(data string) string {return c.strategy.Execute(data)
}type ConcreteStrategyA struct{}func (s *ConcreteStrategyA) Execute(data string) string {return "ConcreteStrategyA executed with " + data
}type ConcreteStrategyB struct{}func (s *ConcreteStrategyB) Execute(data string) string {return "ConcreteStrategyB executed with " + data
}

装饰者模式:

描述:动态地给一个对象添加一些额外的职责,而不必修改对象结构。
优点:增加了代码的灵活性和可扩展性。
缺点:增加了代码的复杂性。

package decoratortype Component interface {Operation() string
}type ConcreteComponent struct{}func (c *ConcreteComponent) Operation() string {return "ConcreteComponent operation"
}type Decorator struct {component Component
}func NewDecorator(component Component) *Decorator {return &Decorator{component: component}
}func (d *Decorator) Operation() string {return d.component.Operation()
}type ConcreteDecoratorA struct {Decorator
}func (d *ConcreteDecoratorA) Operation() string {return "ConcreteDecoratorA added to " + d.Decorator.Operation()
}type ConcreteDecoratorB struct {Decorator
}func (d *ConcreteDecoratorB) Operation() string {return "ConcreteDecoratorB added to " + d.Decorator.Operation()
}

代理模式:

描述:为其他对象提供一种代理以控制对这个对象的访问。
优点:增加了安全性和灵活性。
缺点:增加了代码的复杂性。

package proxytype Subject interface {Request() string
}type RealSubject struct{}func (r *RealSubject) Request() string {return "RealSubject handling request"
}type Proxy struct {realSubject *RealSubject
}func NewProxy() *Proxy {return &Proxy{realSubject: &RealSubject{},}
}func (p *Proxy) Request() string {// Pre-processingprintln("Proxy: Checking access prior to firing a real request.")// Delegate to the real subjectresult := p.realSubject.Request()// Post-processingprintln("Proxy: Logging the time of request.")return result
}

分别调用不同模式的对象实例:

package mainimport ("fmt""singleton""factory""observer""strategy""decorator""proxy"
)func main() {// 单例模式singleton.GetInstance().SetValue("Hello, Singleton!")fmt.Println(singleton.GetInstance().GetValue())// 工厂模式factoryA := &factory.ConcreteFactoryA{}productA := factoryA.CreateProduct()productA.Use()factoryB := &factory.ConcreteFactoryB{}productB := factoryB.CreateProduct()productB.Use()// 观察者模式subject := &observer.ConcreteSubject{}observerA := &observer.ConcreteObserver{name: "ObserverA"}observerB := &observer.ConcreteObserver{name: "ObserverB"}subject.RegisterObserver(observerA)subject.RegisterObserver(observerB)subject.SetState("New State")// 策略模式context := &strategy.Context{}strategyA := &strategy.ConcreteStrategyA{}strategyB := &strategy.ConcreteStrategyB{}context.SetStrategy(strategyA)fmt.Println(context.ExecuteStrategy("Data"))context.SetStrategy(strategyB)fmt.Println(context.ExecuteStrategy("Data"))// 装饰者模式component := &decorator.ConcreteComponent{}decoratorA := &decorator.ConcreteDecoratorA{Decorator: *decorator.NewDecorator(component)}decoratorB := &decorator.ConcreteDecoratorB{Decorator: *decorator.NewDecorator(decoratorA)}fmt.Println(decoratorB.Operation())// 代理模式proxy := proxy.NewProxy()fmt.Println(proxy.Request())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…

Windows搭建流媒体服务并使用ffmpeg推流播放rtsp和rtmp流

文章目录 搭建流媒体服务方式一安装mediamtx启动meidamtx关闭meidamtx 方式二安装ZLMediaKit启动ZLMediaKit关闭ZLMediaKit 安装FFmpeg进行推流使用FFmpeg进行rtmp推流使用VLC播放rtmp流停止FFmpeg的rtmp推流使用FFmpeg进行rtsp推流使用VLC播放rtmp流停止FFmpeg的rtsp推流 本文…

Polybase要求安装orcale jre 7

在安装SQL SERVER时,遇到以下情况:polybase要求安装orcale jre 7更新 51或更高版本 不想安装JDK7。可通过不安装polybase的功能来实现下一步的安装。 1. 点击上一步,回到功能选择的设置界面中。 2. 然后在功能选择窗口中,取消勾选…

深入理解计算机系统 3.7 缓冲区溢出

3.7.1 数据对齐 许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2、4或8)的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。例如,假设一个处理器总是从内存中取8个字节&#xff…

代码随想录刷题记录(二十七)——55. 右旋字符串

(一)问题描述 55. 右旋字符串(第八期模拟笔试)https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数&…

Java 学习路线全解析:从基础到实战,全面掌握 Java 编程

在当今数字化时代,Java 作为一种广泛应用且极具影响力的编程语言,为众多开发者开启了通往技术世界的大门。无论是大型企业级应用开发,还是互联网后端服务构建,Java 都展现出了强大的适应性和稳定性。以下是一条系统全面的 Java 学…

QT打包应用程序文件步骤

QT应用程序(.exe)打包复制到其他电脑 在QT程序在自己电脑编译好了后,需要打包给其他人。这里介绍一下详细步骤: 确定编译器 搜了很多相关的打包教程,但是还是会出现“应用程序无法正常启动(0xc000007b)”这类错误。经过…

我谈维纳(Wiener)复原滤波器

Rafael Gonzalez的《数字图像处理》中,图像复原这章内容几乎全错。上篇谈了图像去噪,这篇谈图像复原。 图像复原也称为盲解卷积,不处理点扩散函数(光学传递函数)的都不是图像复原。几何校正不属于图像复原&#xff0c…

10款音频剪辑推荐!!你的剪辑好帮手!!

在如今的数据化浪潮中,工作已经采用了线上线下相结合。我的工作就需要借助一些剪辑工具,来实现我对音频工具的剪辑。我初次接触到音频剪辑也是因为工作需求,从起初我只是一个音频剪辑的小白,这些工具的协助。吸引着我。对于这些工…

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址: Gitee:https://gitee.com/raymond9/shell Github:https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

Scrapy搭配Selenium爬取豆瓣电影250排行榜动态网页数据

参考CSDN博客:https://blog.csdn.net/qq_43213783/article/details/113063557 2024年11月11日实现。 创建movie_douban爬虫项目: scrapy startproject movie_douban 进入spiders: cd movie_douban/movie_douban/spiders 创建doubanMovieSpi…

想定制RK3566/3568安卓11开机logo吗?触觉智能Purple Pi OH来教你

本文介绍瑞芯微RK3566/RK3568主板/开发板安卓Android11系统替换开机Logo的方法,使用触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566芯片,4核1.8Ghz1T算力NPU;类树莓派设计,Laval社区主荐,已适配全…

如何通过PHP脚本自动推送WordPress文章至百度站长平台

想要提高网站在百度搜索中的曝光度?百度站长平台提供了一个非常方便的API接口,允许网站自动将新发布的内容推送至百度以加快收录。本文将带您一步步实现这一功能,帮助您的WordPress站点实现每日自动推送最新文章的URL至百度站长平台。 1. 前提条件 确保您有一个已安装并运行…

【AliCloud】ack + ack-secret-manager + kms 敏感数据安全存储

介绍 ack-secret-manager支持以Kubernetes Secret实例的形式向集群导入或同步KMS凭据信息,确保您集群内的应用能够安全地访问敏感信息。通过该组件,您可以实现密钥数据的自动更新,使应用负载通过文件系统挂载指定Secret实例来使用凭据信息&a…

【C++ 算法进阶】算法提升十三

目录标题 抽牌概率问题 (动态规划)动态规划题目分析代码 洗衣机问题 (贪心)题目题目分析 抽牌概率问题 (动态规划) 动态规划 假设现在有1~N N张牌 每张牌的序号就代表着他的大小 (1 2 … N&am…

R和MATLAB及Python混合效应模型

R片段 使用 R 进行混合效应模型的分析是一种强有力的方法,尤其在研究带有嵌套或重复测量的复杂数据结构时。混合效应模型能够有效地检测和分析多层级数据中的固定效应和随机效应,这在研究选择性扰动效应时尤为有用。 R 中常用的软件包 lme4&#xff1…

【Python】解析 XML

1、Python 对 XML 的解析 1.1 SAX (simple API for XML ) SAX 解析器使用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。 xml.sax 模块牺牲了便捷性来换取速度和内存占用。 事件驱动指一种基于回调(ca…

网页设计平台:6个技术亮点

想要创建个人或商业网站来分享知识或推广商品吗?这篇文章将为你介绍6个免费的网页制作平台,帮助你即使没有编程基础也能快速、轻松地搭建出专业且引人注目的网站。让我们一起探索这些平台,发现它们的特色和优势。 即时设计 即时设计是一个云…

构造,CF 2029D - Cool Graph

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Cool Graph 二、解题报告 1、思路分析 我们对每条 <u, v>&…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…