中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang怎么實現組合模式和裝飾模式

發布時間:2022-11-28 09:47:28 來源:億速云 閱讀:108 作者:iii 欄目:開發技術

今天小編給大家分享一下Golang怎么實現組合模式和裝飾模式的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

組合模式

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

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

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

component.go

定義節點類型:

package main

type Component interface {
    search(string)
}

file.go

定義文件類型節點,實現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

定義文件夾類型節點,也實現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文件進行組合測試:

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")
}

輸出結果:

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

裝飾模式

裝飾模式也是一種結構模式,通過將對象放置在稱為裝飾器的特殊包裝對象中,允許動態地向對象添加新行為。使用裝飾器可以無數次包裝對象,因為目標對象和裝飾器遵循相同的接口。結果對象將獲得所有包裝器的堆疊行為。下面通過實例進行說明:

pizza.go

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

package main

type IPizza interface {
    getPrice() int
}

veggieMania.go

定義素食披薩,并實現getPrice方法:

package main

type VeggeMania struct {
}

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

tomatoTopping.go

定義番茄匹薩,再次對getPrice方法進行裝飾:

package main

type TomatoTopping struct {
    pizza IPizza
}

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

cheeseTopping.go

定義奶酪匹薩,同時再次對getPrice方法進行裝飾:

package main

type CheeseTopping struct {
    pizza IPizza
}

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

main.go

下面定義具體實現,展示裝飾模式的應用:

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())
}

輸出結果:

Price of veggeMania with tomato and cheese topping is 32

以上就是“Golang怎么實現組合模式和裝飾模式”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沁源县| 阿拉善左旗| 新竹县| 鹿邑县| 炎陵县| 阜南县| 新郑市| 佛山市| 石狮市| 临西县| 内乡县| 西乌珠穆沁旗| 襄垣县| 崇阳县| 荃湾区| 竹山县| 交城县| 襄樊市| 贵南县| 新巴尔虎左旗| 清水县| 康马县| 平利县| 建平县| 尚志市| 洞口县| 乐安县| 滕州市| 彰武县| 泾川县| 遂溪县| 阿城市| 克拉玛依市| 古蔺县| 焦作市| 黄骅市| 两当县| 寻乌县| 云南省| 扎赉特旗| 揭西县|