読者です 読者をやめる 読者になる 読者になる

Go言語入門 / golang 入門 デザインパターン Bridge

プログラミング Go言語 / golang Go言語入門 / golang 入門

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0

こんにちはnasustです。Tech Scoreの9. Bridge パターン | TECHSCORE(テックスコア)を参考にGo言語 / golangで実装してみました。

package main

import (
    "fmt"
    "sort"
)

type StringsLessier interface {
    Less(strings []string, i, j int) bool
}

type StringsSorter struct {
    Strings     []string
    StringsLess StringsLessier
}

func (self *StringsSorter) Len() int {
    return len(self.Strings)
}

func (self *StringsSorter) Less(i, j int) bool {
    return self.StringsLess.Less(self.Strings, i, j)
}

func (self *StringsSorter) Swap(i, j int) {
    self.Strings[i], self.Strings[j] = self.Strings[j], self.Strings[i]
}

type AbsStringsSorter struct {
}

func (self *AbsStringsSorter) Less(strings []string, i, j int) bool {
    return strings[i] < strings[j]
}

type PrintStringsSorter struct {
    Lessier StringsLessier
}

func (self *PrintStringsSorter) Less(strings []string, i, j int) bool {
    fmt.Println("string:i:", i, ":", strings[i], ", j:", j, ":", strings[j])
    return self.Lessier.Less(strings, i, j)
}

func main() {
    absSorter := &StringsSorter{
        []string{"aaa", "ccc", "bbb", "eee"},
        &PrintStringsSorter{&AbsStringsSorter{}}}
    sort.Sort(absSorter)

    fmt.Println(absSorter.Strings)
}

実行すると以下のようになります。

string:i: 1 : ccc , j: 0 : aaa
string:i: 2 : bbb , j: 1 : ccc
string:i: 1 : bbb , j: 0 : aaa
string:i: 3 : eee , j: 2 : ccc
[aaa bbb ccc eee]

StringsSorterのフィールドにStringsLessierインターフェイスがあります。StringsSorterはsort.Interfaceを実装しており、sort.Sort実行時のLessメソッドが呼ばれます。 LessメソッドでStringsLessier.Lessに委譲することで橋渡ししています。

このように委譲することで比較の実装を組み合わせることができます。


Go言語 / golang 入門 目次に戻る

広告を非表示にする