Go 實現常用設計模式(四)介面卡模式

pibigstar發表於2019-09-07

介面卡適合用於解決新舊系統(或新舊介面)之間的相容問題,而不建議在一開始就直接使用

意圖:
介面卡模式將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間

關鍵程式碼:
介面卡中持有舊介面物件,並實現新介面

Go實現介面卡模式

package adaptor

import "fmt"

// 我們的介面(新介面)——音樂播放
type MusicPlayer interface {
    play(fileType string, fileName string)
}

// 在網上找的已實現好的庫 音樂播放
// ( 舊介面)
type ExistPlayer struct {
}

func (*ExistPlayer) playMp3(fileName string) {
    fmt.Println("play mp3 :", fileName)
}
func (*ExistPlayer) playWma(fileName string) {
    fmt.Println("play wma :", fileName)
}

// 介面卡
type PlayerAdaptor struct {
    // 持有一箇舊介面
    existPlayer ExistPlayer
}

// 實現新介面
func (player *PlayerAdaptor) play(fileType string, fileName string) {
    switch fileType {
    case "mp3":
        player.existPlayer.playMp3(fileName)
    case "wma":
        player.existPlayer.playWma(fileName)
    default:
        fmt.Println("暫時不支援此型別檔案播放")
    }
}

測試用例

package adaptor

import "testing"

func TestAdaptor(t *testing.T) {
    player := PlayerAdaptor{}
    player.play("mp3", "死了都要愛")
    player.play("wma", "滴滴")
    player.play("mp4", "復仇者聯盟")
}

具體程式碼

更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star,你的支援,是我最大的動力!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章