1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go言語基本テンプレートデザインパターン例解説

2022-01-06 15:06:07

概要

テンプレートメソッドパターンは、アルゴリズムのステップを定義し、サブカテゴリが1つ以上のステップのためにその練習を提供することを可能にします。アルゴリズムのアーキテクチャを変更することなく、サブカテゴリにアルゴリズムの特定のステップを再定義させることができます。

環境や人などの要因で一つのステップの正確な実装が不明な場合に、ステップの実行順序を定義する。

テンプレートモデルの活用例

ゲストを食事に招待する [注文->食べる->チェックアウト] みんな違う料理を注文し、違う料理を食べ、チェックアウトはどこかからどこかへ違う [開始->旅行モード->終了] 開始と終了が同じでなく、みんな違う旅行をしたことになる

Goにはカプセル化、継承、ポリモーフィズムの概念はありませんが、これらの機能を実装する方法は他にもあります

  • カプセル化:メソッドで実装
  • 継承:匿名フィールドによる
  • ポリモーフィズム:インターフェースで実装

ポリシーパターンには2つの役割があります。

<テーブル 番号 文字 説明 1 抽象親クラス(AbstractClass) アルゴリズムの骨格を定義するテンプレートメソッドを実装しています。 2 具体的なクラス 抽象クラスで抽象メソッドを実装する、つまり、異なるオブジェクトの具体的な実装内容

UML

概要

長所

  • 不変部分をカプセル化し、可変部分を拡張する。
  • メンテナンスが容易なように、公開コードを抽出します。
  • 動作は親クラスが制御し、子クラスが実装する。

デメリット

実装が異なるごとにサブクラスが必要になるため、クラス数の増加につながり、システムがさらに大きくなる

利用シーン

複数のサブクラスで共通のメソッドがあり、同じロジックがある

テンプレートメソッドといえるような重要で複雑なメソッド

package main
import "fmt"
/* Travel mode interface*/
type Itravel interface {
	Starting() // starting point
	Travel() //travel mode
	End() // end point
}
//define the parent class
type Persion struct {
	Name string // Name
	Itravel Itravel // Travel mode interface
}
func (persion *Persion) SetName(name string) {
	persion.Name = name
}
func (persion Persion) Starting() {
	persion.Itravel.Starting()
Starting() }
func (persion Persion) Travel() {
	Travel()
}
func (persion Persion) End() {
	persion.Itravel.End()
}
// Algorithm skeleton
func (persion Persion) Start() {
	if persion.Itravel == nil {
		fmt.Println("Itravel is nil")
		return
	}
	fmt.Printf("%s", persion.Name)	
	persion.Starting()
	persion.Travel()
	persion.End()
	fmt.Println("\n")
}
// Concrete class: ZhangSan
type ZhangSan struct {
	Persion // anonymous fields to achieve inheritance
}
func NewZhangSan() *ZhangSan {
	c := new(ZhangSan)
	c.Persion = Persion{Itravel: c}
	return c
}
func (_ ZhangSan) Starting() {
	fmt.Printf("Starting from %s", "Beijing")
}

func (_ ZhangSan) Travel() {
	fmt.Printf(" %s", "train")
}
func (_ ZhangSan) End() {
	fmt.Printf(" %s", "Arrived in Shanghai")
}
// Concrete class: LiSi
type LiSi struct {
	Persion
}
func (_ LiSi) Starting() {
	fmt.Printf("Starting from %s", "Guangzhou")
}
func (_ LiSi) Travel() {
	fmt.Printf(" %s", "By plane")
}
func (_ LiSi) End() {
	fmt.Printf(" %s", "Arrived in Chongqing")
}
func main() {
	// Zhang San
	zhangsan := NewZhangSan()
	zhangsan.SetName("ZhangSan")
	zhangsan.Start()
	persion := &Version{}
	persion.SetName("Zhang San")
	persion.Itravel = ZhangSan{}
	persion.Start()
	// Li Si
	persion.SetName("李四")
	persion.Itravel = &LiSi{}
	persion.Start()
	lisi := LiSi{}
	lisi.Itravel = lisi
	lisi.SetName("LiSi")
	lisi.Start()
}


上記は、Go言語の基本的なテンプレートのデザインパターンの例の詳細であり、Go言語のテンプレートのデザインパターンの詳細については、スクリプトの家の他の関連記事に注意を払うしてください!...