最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go設(shè)計模式之訪問者模式講解和代碼示例

 更新時間:2023年08月25日 08:27:26   作者:demo007x  
訪問者是一種行為設(shè)計模式, 允許你在不修改已有代碼的情況下向已有類層次結(jié)構(gòu)中增加新的行為,本文將通過代碼示例給大家詳細(xì)的介紹一下Go設(shè)計模式之訪問者模式,需要的朋友可以參考下

Go 訪問者模式講解和代碼示例

訪問者是一種行為設(shè)計模式, 允許你在不修改已有代碼的情況下向已有類層次結(jié)構(gòu)中增加新的行為。

閱讀我們的文章訪問者和雙分派以了解為什么不能通過方法重載來簡單地替換訪問者。

概念示例

訪問者模式允許你在結(jié)構(gòu)體中添加行為, 而又不會對結(jié)構(gòu)體造成實際變更。 假設(shè)你是一個代碼庫的維護(hù)者, 代碼庫中包含不同的形狀結(jié)構(gòu)體, 如:

  • 方形
  • 圓形
  • 三角形

上述每個形狀結(jié)構(gòu)體都實現(xiàn)了通用形狀接口。

在公司員工開始使用你維護(hù)的代碼庫時, 你就會被各種功能請求給淹沒。 讓我們來看看其中比較簡單的請求: 有個團(tuán)隊請求你在形狀結(jié)構(gòu)體中添加 get­Area獲取面積行為。

解決這一問題的辦法有很多。

第一個選項便是將 get­Area方法直接添加至形狀接口, 然后在各個形狀結(jié)構(gòu)體中進(jìn)行實現(xiàn)。 這似乎是比較好的解決方案, 但其代價也比較高。 作為代碼庫的管理員, 相信你也不想在每次有人要求添加另外一種行為時就去冒著風(fēng)險改動自己的寶貝代碼。 不過, 你也一定想讓其他團(tuán)隊的人還是用一用自己的代碼庫。

第二個選項是請求功能的團(tuán)隊自行實現(xiàn)行為。 然而這并不總是可行, 因為行為可能會依賴于私有代碼。

第三個方法就是使用訪問者模式來解決上述問題。 首先定義一個如下訪問者接口:

type visitor interface {
    visitForSquare(square)
    visitForCircle(circle)
    visitForTriangle(triangle)
}

我們可以使用 visit­For­Square­(square)visit­For­Circle­(circle)以及 visit­For­Triangle­(triangle)函數(shù)來為方形、 圓形以及三角形添加相應(yīng)的功能。

你可能在想, 為什么我們不再訪問者接口里面使用單一的 visit­(shape)方法呢? 這是因為 Go 語言不支持方法重載, 所以你無法以相同名稱、 不同參數(shù)的方式來使用方法。

好了, 第二項重要的工作是將 accept接受方法添加至形狀接口中。

func accept(v visitor)

所有形狀結(jié)構(gòu)體都需要定義此方法, 類似于:

func (obj *square) accept(v visitor){
    v.visitForSquare(obj)
}

等等, 我剛才是不是提到過, 我們并不想修改現(xiàn)有的形狀結(jié)構(gòu)體? 很不幸, 在使用訪問者模式時, 我們必須要修改形狀結(jié)構(gòu)體。 但這樣的修改只需要進(jìn)行一次。

如果添加任何其他行為, 比如 get­Num­Sides獲取邊數(shù)和 get­Middle­Coordinates獲取中點坐標(biāo) , 我們將使用相同的 accept­(v visitor)函數(shù), 而無需對形狀結(jié)構(gòu)體進(jìn)行進(jìn)一步的修改。

最后, 形狀結(jié)構(gòu)體只需要修改一次, 并且所有未來針對不同行為的請求都可以使用相同的 accept 函數(shù)來進(jìn)行處理。 如果團(tuán)隊成員請求 get­Area行為, 我們只需簡單地定義訪問者接口的具體實現(xiàn), 并在其中編寫面積的計算邏輯即可。

shape.go: 元件

package main
// 形狀結(jié)構(gòu)體
type Shape interface {
	getType() string
	accept(Visitor)
}

square.go: 具體元件

package main
type Square struct {
	side int
}
func (s *Square) accept(v Visitor) {
	v.visitForSquare(s)
}
func (s *Square) getType() string {
	return "Square"
}

circle.go: 具體元件

package main
type Circle struct {
	radius int
}
func (c *Circle) accept(v Visitor) {
	v.visitForCircle(c)
}
func (c *Circle) getType() string {
	return "Circle"
}

rectangle.go: 具體元件

package main
type Rectangle struct {
	l int
	b int
}
func (t *Rectangle) accept(v Visitor) {
	v.visitForrectangle(t)
}
func (t *Rectangle) getType() string {
	return "rectangle"
}

visitor.go: 訪問者

package main
type Visitor interface {
	visitForSquare(*Square)
	visitForCircle(*Circle)
	visitForrectangle(*Rectangle)
}

areaCalculator.go: 具體訪問者

package main
import "fmt"
type AreaCalculator struct {
	area int
}
func (a *AreaCalculator) visitForSquare(s *Square) {
	fmt.Println("calculating area for square")
}
func (a *AreaCalculator) visitForCircle(s *Circle) {
	fmt.Println("Calculating area for circle")
}
func (a *AreaCalculator) visitForrectangle(s *Rectangle) {
	fmt.Println("Calculating area for rectangle")
}

middleCoordinates.go: 具體訪問者

package main
import "fmt"
type MiddleCoordinates struct {
	x int
	y int
}
func (a *MiddleCoordinates) visitForSquare(s *Square) {
	fmt.Println("Calculating middle point coordinates for square")
}
func (a *MiddleCoordinates) visitForCircle(c *Circle) {
	fmt.Println("Calculating middle point coordinates for circle")
}
func (a *MiddleCoordinates) visitForrectangle(t *Rectangle) {
	fmt.Println("Calculating middle point coordinates for rectangle")
}

main.go: 客戶端代碼

package main
import "fmt"
func main() {
	square := &Square{side: 2}
	circle := &Circle{radius: 3}
	rectangle := &Rectangle{l: 2, b: 3}
	areaCalculator := &AreaCalculator{}
	square.accept(areaCalculator)
	circle.accept(areaCalculator)
	rectangle.accept(areaCalculator)
	fmt.Println()
	middleCoordinates := &MiddleCoordinates{}
	square.accept(middleCoordinates)
	circle.accept(middleCoordinates)
	rectangle.accept(middleCoordinates)
}

output.txt: 執(zhí)行結(jié)果

calculating area for square
Calculating area for circle
Calculating area for rectangle

Calculating middle point coordinates for square
Calculating middle point coordinates for circle

到此這篇關(guān)于Go設(shè)計模式之訪問者模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go訪問者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅關(guān)閉深入理解

    Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅關(guān)閉深入理解

    這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫http?server的優(yōu)雅有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪關(guān)閉深入理解
    2024-01-01
  • Go中信號量的5種經(jīng)典實現(xiàn)方式

    Go中信號量的5種經(jīng)典實現(xiàn)方式

    本文主要介紹了Go中信號量的5種經(jīng)典實現(xiàn)方式,可以解決高并發(fā)資源控制難題,涵蓋互斥鎖、通道、第三方庫等實現(xiàn)方式,適用于限流、協(xié)程池等場景,感興趣的可以了解一下
    2026-05-05
  • Go語言七篇入門教程四通道及Goroutine

    Go語言七篇入門教程四通道及Goroutine

    這篇文章主要為大家介紹了Go語言的通道及Goroutine示例詳解,本文是Go語言七篇入門系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • golang?gorm實現(xiàn)get請求查詢案例測試

    golang?gorm實現(xiàn)get請求查詢案例測試

    這篇文章主要為大家介紹了golang?gorm實現(xiàn)get請求查詢案例測試,
    2022-04-04
  • goalng?結(jié)構(gòu)體?方法集?接口實例詳解

    goalng?結(jié)構(gòu)體?方法集?接口實例詳解

    這篇文章主要為大家介紹了goalng?結(jié)構(gòu)體?方法集?接口實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 深度解密 Go 語言中的 sync.map

    深度解密 Go 語言中的 sync.map

    這篇文章主要介紹了深度解密 Go 語言中的 sync.map,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Golang Web 框架Iris安裝部署

    Golang Web 框架Iris安裝部署

    這篇文章主要為大家介紹了Golang Web 框架Iris安裝部署,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 基于Go語言實現(xiàn)冒泡排序算法

    基于Go語言實現(xiàn)冒泡排序算法

    冒泡排序是交換排序中最簡單的一種算法。這篇文章將利用Go語言實現(xiàn)冒泡排序算法,文中的示例代碼講解詳細(xì),對學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • GoLang日志監(jiān)控系統(tǒng)實現(xiàn)

    GoLang日志監(jiān)控系統(tǒng)實現(xiàn)

    這篇文章主要介紹了GoLang日志監(jiān)控系統(tǒng)的實現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12

最新評論

陇川县| 阿尔山市| 松溪县| 海兴县| 新闻| 土默特左旗| 榕江县| 久治县| 绿春县| 怀化市| 家居| 南安市| 花莲市| 永昌县| 温州市| 古蔺县| 伊通| 太湖县| 宣恩县| 周口市| 南丹县| 特克斯县| 固始县| 万年县| 嘉兴市| 南汇区| 高碑店市| 泽普县| 和硕县| 肃宁县| 炎陵县| 洛南县| 宁南县| 泰顺县| 酒泉市| 吉首市| 中宁县| 麻城市| 新密市| 通道| 博兴县|