Golang設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)
1. 模擬場(chǎng)景
實(shí)現(xiàn)需求為玩家擁有多個(gè)英雄,在部署好英雄之后,只用點(diǎn)擊進(jìn)攻,不用關(guān)心每個(gè)英雄具體自己的攻擊手段!
2099/12/29 14:19:48 李信釋放大招!
2099/12/29 14:19:48 李白釋放大招!
外觀模式(Facade),為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
2. 代碼實(shí)現(xiàn)
2.1 Hero
package main
// 實(shí)例化
func NewHero() Hero{
return &heroImpl{
LiXin: NewLixinHero(),
LiBai: NewLiBaiHero(),
}
}
// 英雄抽象行為
type Hero interface {
Attack() error
}
// 英雄池
type heroImpl struct {
LiXin LixinHero
LiBai LiBaiHero
}
// 統(tǒng)一的調(diào)用所有英雄的攻擊,化為一個(gè)攻擊按鈕
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. 含義
? 由此可見,外觀模式十分的簡(jiǎn)單,我們只需在客戶端攻擊即可,內(nèi)部的英雄的任何操作都不需要我們關(guān)注,對(duì)于面向?qū)ο笥幸欢ɑA(chǔ)的朋友,即使沒(méi)有聽說(shuō)過(guò)外觀模式,也完全有可能在很多時(shí)候使用它,因?yàn)樗昝赖伢w現(xiàn)了依賴倒轉(zhuǎn)原則和迪米特法則的思想,所以是非常常用的模式之一。
我們使用外觀模式的情況有很多,比如經(jīng)典的MVC三層架構(gòu),可以考慮在數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)邏輯層、業(yè)務(wù)邏輯層和表示層的層與層之間簡(jiǎn)歷外觀Facade,降低耦合。屏蔽了和內(nèi)部復(fù)雜的手段交互過(guò)程,外界更為輕松!
到此這篇關(guān)于Golang設(shè)計(jì)模式之外觀模式的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Go外觀模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
源碼分析Go語(yǔ)言使用cgo導(dǎo)致線程增長(zhǎng)的原因
這篇文章主要從一個(gè)cgo調(diào)用開始解析Go語(yǔ)言源碼,從而分析一下造成線程增長(zhǎng)的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2023-06-06
GoFrame框架Scan類型轉(zhuǎn)換實(shí)例
這篇文章主要為大家介紹了GoFrame框架Scan類型轉(zhuǎn)換的實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
golang gorm 計(jì)算字段和獲取sum()值的實(shí)現(xiàn)
這篇文章主要介紹了golang gorm 計(jì)算字段和獲取sum()值的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
GoFrame?gredis緩存DoVar及Conn連接對(duì)象的自動(dòng)序列化
這篇文章主要為大家介紹了GoFrame?gredis干貨DoVar?Conn連接對(duì)象自動(dòng)序列化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
golang實(shí)現(xiàn)圖像驗(yàn)證碼的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用golang實(shí)現(xiàn)簡(jiǎn)單的圖像驗(yàn)證碼,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10

