亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang實(shí)現(xiàn)組合模式和裝飾模式實(shí)例詳解

 更新時(shí)間:2022年11月26日 16:40:00   作者:夢想畫家  
這篇文章主要介紹了Golang實(shí)現(xiàn)組合模式和裝飾模式,本文介紹組合模式和裝飾模式,golang實(shí)現(xiàn)兩種模式有共同之處,但在具體應(yīng)用場景有差異。通過對比兩個(gè)模式,可以加深理解,需要的朋友可以參考下

本文介紹組合模式和裝飾模式,golang實(shí)現(xiàn)兩種模式有共同之處,但在具體應(yīng)用場景有差異。通過對比兩個(gè)模式,可以加深理解。

組合模式

組合是一種結(jié)構(gòu)設(shè)計(jì)模式,它允許將對象組合成樹狀結(jié)構(gòu),并將其作為單一對象使用。對于需要構(gòu)建樹形結(jié)構(gòu)的大多數(shù)問題,組合結(jié)構(gòu)成為常用的解決方案,它最大特性是能夠在整個(gè)樹結(jié)構(gòu)上遞歸運(yùn)行方法并對結(jié)果進(jìn)行匯總。

這里通過操作系統(tǒng)的文件系統(tǒng)來理解Composite模式。在文件系統(tǒng)中有兩種類型的對象: 文件和文件夾。有些情況下文件和文件夾應(yīng)該以相同的方式對待。這就是Composite模式派上用場的地方。

假設(shè)您需要在文件系統(tǒng)中對特定的關(guān)鍵字進(jìn)行搜索。此搜索操作同時(shí)適用于文件和文件夾。對于一個(gè)文件,它只會查看文件的內(nèi)容;對于一個(gè)文件夾,它將遍歷該文件夾的所有文件以找到該關(guān)鍵字。下面通過實(shí)例進(jìn)行說明。

component.go

定義節(jié)點(diǎn)類型:

package main

type Component interface {
    search(string)
}

file.go

定義文件類型節(jié)點(diǎn),實(shí)現(xiàn)search方法:

package main

import "fmt"

type File struct {
    name string
}

func (f *File) search(keyword string) {
    fmt.Printf("Searching for keyword %s in file %s\n", keyword, f.name)
}

func (f *File) getName() string {
    return f.name
}

folder.go

定義文件夾類型節(jié)點(diǎn),也實(shí)現(xiàn)search方法:

package main

import "fmt"

type Folder struct {
    components []Component
    name       string
}

func (f *Folder) search(keyword string) {
    fmt.Printf("Serching recursively for keyword %s in folder %s\n", keyword, f.name)
    for _, composite := range f.components {
        composite.search(keyword)
    }
}

func (f *Folder) add(c Component) {
    f.components = append(f.components, c)
}

組合測試

定義main.go文件進(jìn)行組合測試:

package main

func main() {
    file1 := &File{name: "File1"}
    file2 := &File{name: "File2"}
    file3 := &File{name: "File3"}

    folder1 := &Folder{
        name: "Folder1",
    }

    folder1.add(file1)

    folder2 := &Folder{
        name: "Folder2",
    }
    folder2.add(file2)
    folder2.add(file3)
    folder2.add(folder1)

    folder2.search("rose")
}

輸出結(jié)果:

Serching recursively for keyword rose in folder Folder2
Searching for keyword rose in file File2
Searching for keyword rose in file File3
Serching recursively for keyword rose in folder Folder1
Searching for keyword rose in file File1

裝飾模式

裝飾模式也是一種結(jié)構(gòu)模式,通過將對象放置在稱為裝飾器的特殊包裝對象中,允許動態(tài)地向?qū)ο筇砑有滦袨?。使用裝飾器可以無數(shù)次包裝對象,因?yàn)槟繕?biāo)對象和裝飾器遵循相同的接口。結(jié)果對象將獲得所有包裝器的堆疊行為。下面通過實(shí)例進(jìn)行說明:

pizza.go

定義披薩類型,包括getPrice方法:

package main

type IPizza interface {
    getPrice() int
}

veggieMania.go

定義素食披薩,并實(shí)現(xiàn)getPrice方法:

package main

type VeggeMania struct {
}

func (p *VeggeMania) getPrice() int {
    return 15
}

tomatoTopping.go

定義番茄匹薩,再次對getPrice方法進(jìn)行裝飾:

package main

type TomatoTopping struct {
    pizza IPizza
}

func (c *TomatoTopping) getPrice() int {
    pizzaPrice := c.pizza.getPrice()
    return pizzaPrice + 7
}

cheeseTopping.go

定義奶酪匹薩,同時(shí)再次對getPrice方法進(jìn)行裝飾:

package main

type CheeseTopping struct {
    pizza IPizza
}

func (c *CheeseTopping) getPrice() int {
    pizzaPrice := c.pizza.getPrice()
    return pizzaPrice + 10
}

main.go

下面定義具體實(shí)現(xiàn),展示裝飾模式的應(yīng)用:

package main

import "fmt"

func main() {

    // 定義匹薩
    pizza := &VeggeMania{}

    // 增加奶酪
    pizzaWithCheese := &CheeseTopping{
        pizza: pizza,
    }

    // 增加番茄
    pizzaWithCheeseAndTomato := &TomatoTopping{
        pizza: pizzaWithCheese,
    }

    fmt.Printf("Price of veggeMania with tomato and cheese topping is %d\n", pizzaWithCheeseAndTomato.getPrice())
}

輸出結(jié)果:

Price of veggeMania with tomato and cheese topping is 32

到此這篇關(guān)于Golang實(shí)現(xiàn)組合模式和裝飾模式的文章就介紹到這了,更多相關(guān)go組合模式和裝飾模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows下使用GoLand生成proto文件的方法步驟

    windows下使用GoLand生成proto文件的方法步驟

    本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Golang 按行讀取文件的三種方法小結(jié)

    Golang 按行讀取文件的三種方法小結(jié)

    本文主要介紹了Golang 按行讀取文件的三種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn)

    Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn)

    go語言用來執(zhí)行一個(gè)系統(tǒng)的命令相對python來說還是有點(diǎn)復(fù)雜的,執(zhí)行命令是一個(gè)非常常見的需求,本文主要介紹了Go語言執(zhí)行cmd命令庫的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • golang判斷結(jié)構(gòu)體為空的問題

    golang判斷結(jié)構(gòu)體為空的問題

    這篇文章主要介紹了golang判斷結(jié)構(gòu)體為空的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • golang flag簡單用法

    golang flag簡單用法

    本篇文章介紹了golang flag包的一個(gè)簡單的用法,希望通過一個(gè)簡單的實(shí)例,能讓大家了解它的用法,從中獲得啟發(fā)
    2018-09-09
  • go實(shí)現(xiàn)for range迭代時(shí)修改值的操作

    go實(shí)現(xiàn)for range迭代時(shí)修改值的操作

    這篇文章主要介紹了go實(shí)現(xiàn)for range迭代時(shí)修改值的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang實(shí)現(xiàn)超時(shí)退出的三種方式

    Golang實(shí)現(xiàn)超時(shí)退出的三種方式

    這篇文章主要介紹了Golang三種方式實(shí)現(xiàn)超時(shí)退出,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Go語言kube-scheduler深度剖析與開發(fā)之pod調(diào)度

    Go語言kube-scheduler深度剖析與開發(fā)之pod調(diào)度

    這篇文章主要為大家介紹了Go語言kube-scheduler深度剖析與開發(fā),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go語言中int、float、string類型之間相互的轉(zhuǎn)換

    Go語言中int、float、string類型之間相互的轉(zhuǎn)換

    golang是強(qiáng)類型語言,在應(yīng)用過程中類型轉(zhuǎn)換基本都會用到,下面這篇文章主要給大家介紹了關(guān)于Go語言中int、float、string類型相互之間的轉(zhuǎn)換,需要的朋友可以參考下
    2022-01-01
  • 深入理解Go語言中的數(shù)組和切片

    深入理解Go語言中的數(shù)組和切片

    Go語言中的數(shù)組大概相當(dāng)與C/C++中的數(shù)組,固定大小,不能夠動態(tài)擴(kuò)展大小,而切片大概相當(dāng)與C++中的Vector,可以動態(tài)擴(kuò)展大小,當(dāng)大小超過容量時(shí),重新分配一塊內(nèi)存,然后將數(shù)據(jù)復(fù)制到新的內(nèi)存區(qū)域。下面我們通過幾個(gè)問題來更好理解golang 的數(shù)組和切片,一起來看看吧。
    2016-09-09

最新評論