Golang设计模式之外观模式的实现

 更新时间:2023年05月11日 11:07:26   作者:未来谁可知  
这篇文章主要介绍了Golang设计模式之外观模式的实现,外观模式是一种常用的设计模式之一,是一种结构型设计模式,它提供了一个简单的接口来访问复杂系统的各种功能,从而降低了系统的复杂度,需要详细了解可以参考下文

1. 模拟场景

实现需求为玩家拥有多个英雄,在部署好英雄之后,只用点击进攻,不用关心每个英雄具体自己的攻击手段!

2099/12/29 14:19:48 李信释放大招!
2099/12/29 14:19:48 李白释放大招!

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2. 代码实现

2.1 Hero

package main
// 实例化
func NewHero() Hero{
	return &heroImpl{
         LiXin: NewLixinHero(),
         LiBai: NewLiBaiHero(),
	}
}
// 英雄抽象行为
type Hero interface {
	Attack() error
}
// 英雄池
type heroImpl struct {
	LiXin LixinHero
	LiBai LiBaiHero
}
// 统一的调用所有英雄的攻击,化为一个攻击按钮
func (h heroImpl) Attack() error {
	err := h.LiXin.Attack()
	if err!=nil{
		return err
	}
	err = h.LiBai.Attack()
	if err!=nil{
		return err
	}
	return nil
}

2.2 LiXin

package main
import "log"
// 李信的抽象行为
type LixinHero interface {
	Attack() error
}
// 英雄李信
type lixinHero struct {
}
func NewLixinHero() *lixinHero {
	return &lixinHero{}
}
// 李信的攻击手段
func (l lixinHero) Attack() error {
	log.Println("李信释放大招!")
	return nil
}

2.3 LiBai

package main
import "log"
// 李白的抽象行为
type LiBaiHero interface {
	Attack() error
}
// 英雄李白
type libaiHero struct {
}
func NewLiBaiHero() *libaiHero {
	return &libaiHero{}
}
// 李白的攻击手段
func (l libaiHero) Attack() error {
	log.Println("李白释放大招!")
	return nil
}

2.4 main

部署好后的,一键攻击!!

package main
import "log"
func main(){
	hero:=NewHero()   // 部署阶段
	err:=hero.Attack()  // 一键攻击
	if err!=nil{
		log.Fatal(err)
	}
}

3. 含义

​ 由此可见,外观模式十分的简单,我们只需在客户端攻击即可,内部的英雄的任何操作都不需要我们关注,对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。

我们使用外观模式的情况有很多,比如经典的MVC三层架构,可以考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间简历外观Facade,降低耦合。屏蔽了和内部复杂的手段交互过程,外界更为轻松!

到此这篇关于Golang设计模式之外观模式的实现的文章就介绍到这了,更多相关Go外观模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 源码分析Go语言使用cgo导致线程增长的原因

    源码分析Go语言使用cgo导致线程增长的原因

    这篇文章主要从一个cgo调用开始解析Go语言源码,从而分析一下造成线程增长的原因,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一学习一下
    2023-06-06
  • Go 1.18新特性之泛型的全面讲解

    Go 1.18新特性之泛型的全面讲解

    本文力求能让未接触过泛型编程的人也能较好理解Go的泛型,所以行文可能略显啰嗦。但是请相信我,看完这篇文章你能获得对Go泛型非常全面的了解
    2023-03-03
  • Golang极简入门教程(一):基本概念

    Golang极简入门教程(一):基本概念

    这篇文章主要介绍了Golang极简入门教程(一):基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下
    2014-10-10
  • GoFrame框架Scan类型转换实例

    GoFrame框架Scan类型转换实例

    这篇文章主要为大家介绍了GoFrame框架Scan类型转换的实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • golang gorm 计算字段和获取sum()值的实现

    golang gorm 计算字段和获取sum()值的实现

    这篇文章主要介绍了golang gorm 计算字段和获取sum()值的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍,感兴趣的朋友跟随小编一起看看吧
    2018-11-11
  • 浅谈Go语言的error类型

    浅谈Go语言的error类型

    这篇文章主要介绍了浅谈Go语言的error类型,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    GoFrame gredis缓存DoVar及Conn连接对象的自动序列化

    这篇文章主要为大家介绍了GoFrame gredis干货DoVar Conn连接对象自动序列化详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go log库的使用示例详解

    Go log库的使用示例详解

    Go语言内置的log库提供了基本的日志记录功能,支持日志的格式化输出、设置日志前缀、配置输出位置等,可以通过标准logger或创建新的Logger对象来使用,log库简单易用,但功能有限,可能需要配合第三方日志库如logrus、zap等来满足复杂需求
    2024-09-09
  • golang实现图像验证码的示例代码

    golang实现图像验证码的示例代码

    这篇文章主要为大家详细介绍了如何利用golang实现简单的图像验证码,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论