2024年最新使用Go实现23种设计模式——结构型模式(上)_go图解设计模式(2),2024年最新从消息中间件看分布式系统的多种套路

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

}

func NewInfoNotification(message MessageInterface) *InfoNotification {
return &InfoNotification{message: message}
}

func (n *InfoNotification) Notify(msg string) error {
return n.message.Send(msg)
}

func main() {
notify := NewInfoNotification(&EmailMessage{})
err := notify.Notify(“Info”)
if err != nil {
return
}
}


#### 桥接模式优点


1. 抽象与实现分离,扩展能力强
2. 符合开闭原则、合成复用原则


#### 桥接模式缺点


1. 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度


### 组合模式


将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性


#### 适用场景


1. 公司部门架构等场景


#### Go语言实现



type IOrganization interface {
Count() int
}

type Employee struct {
Name string
}

func (*Employee) Count() int {
return 1
}

type Department struct {
Name string
SubOrganization []IOrganization
}

func (d *Department) Count() (count int) {
for _, organization := range d.SubOrganization {
count += organization.Count()
}
return count
}

func (d *Department) AddOrganization(organization IOrganization) {
d.SubOrganization = append(d.SubOrganization, organization)
}


#### 组合模式优点


1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码
2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”


#### 组合模式缺点


1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系
2. 不容易限制容器中的构件,不容易用继承的方法来增加构件的新功能


### 装饰模式


向现有的对象添加新的功能,同时又不改变其结构,即动态地给对象添加一些额外的功能


#### 适用场景


1. 当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时
2. 当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时,采用继承关系很难实现,而采用装饰器模式却很好实现
3. 当对象的功能要求可以动态地添加,也可以再动态地撤销时


#### Go语言实现



// 抽象装饰类
type IDecorate interface {
Run()
}

type Decorate struct {
Func func()
decorateBefore []IDecorate
decorateAfter []IDecorate
}

func (d *Decorate) Before(decorate …IDecorate) {
d.decorateBefore = append(d.decorateBefore, decorate…)
}

func (d *Decorate) After(decorate …IDecorate) {
d.decorateAfter = append(d.decorateAfter, decorate…)
}

func (d *Decorate) Run() {
for _, decorateBefore := range d.decorateBefore {
decorateBefore.Run()
}
d.Func()
for _, decorateAfter := range d.decorateAfter {
decorateAfter.Run()
}
}

// 具体装饰类
type ADecorate struct {
}

func (d *ADecorate) Run() {
fmt.Println(“执行A”)
}

type BDecorate struct {
}

func (d *BDecorate) Run() {
fmt.Println(“执行B”)
}

func main() {
a := Decorate{Func: func() {
fmt.Println(“Hello”)
}}
a.Before(&ADecorate{})
a.Before(&BDecorate{})
a.After(&ADecorate{})
a.Run()
}


#### 装饰模式优点


1. 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
2. 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
3. 装饰器模式完全遵守开闭原则


#### 装饰模式缺点



![img](https://img-blog.csdnimg.cn/img_convert/83bd937ed5aa718da1ba6281afaa4053.png)
![img](https://img-blog.csdnimg.cn/img_convert/666bb5a63942396deebf98bcc7d0d624.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值