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言語のテンプレートのデザインパターンの詳細については、スクリプトの家の他の関連記事に注意を払うしてください!...
関連
-
囲碁言語switch条件文の基本的な使い方と例文詳細
-
Go言語の基本的な反射の例について説明する
-
囲碁言語基本閉鎖原理分析例詳細
-
golangはファイルをダウンロードするためにマルチプロセッシングを実装しています(ブレークポイント転送をサポート)。
-
Golang 効率的なソートデータの詳細
-
golang言語でのwasm環境構築の流れを詳しく説明します
-
初心者のための囲碁言語 ブラッシュアップ プリントアウト砂時計
-
同時進行のプログラミングを行う sync.Once
-
Go言語 構造体とメソッドの基本構文
-
go 言語のデバッグ: exec: "gcc": 実行可能ファイルが %PATH% に見つからない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン