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

Go言語基本デザインパターン - 戦略パターン例解説

2022-01-06 13:14:40

概要

一連のアルゴリズムを定義し、それぞれをラッピングし、交換できるようにする。ポリシーパターンでは、アルゴリズムを使用するクライアントに依存せずに変更することができます。

同じ種類の問題に対する複数のアプローチ

I. ポリシーパターンを使用しない

package main
import "fmt"
type User struct {
	Name string
name string }
func (this User) travel(t string) {
	switch t {
	case "Airplane":
		fmt.Printf("%s,Plane travel \n", this.Name)
	case "Train":
		fmt.Printf("%s,train travel\n", this.Name)
	case "walk":
		fmt.Printf("%s,walk trip\n", this.Name)
	default:
		fmt.Println("Did you not choose a travel method")
	}
}
func main() {
	User{"Zhang San"}.travel("Airplane")
	User{"Zhang San"}.travel("train")
	User{"Zhang San"}.travel("walk")
	User{"Zhang San"}.travel("")
}


質問です。

コードが大きく、複雑で、もし...そうでなければ...多くの、メンテナンスや拡張に資するものではない"オープンクローズの原則"に違反して、移動する新しい方法を追加すると、ソースコードを変更する必要があります貧しい再利用性、1つまたはいくつかのアルゴリズムだけを再利用することはできません。

II. 戦略モデル

生きた戦略パターンの例。

張三は広東から北京へ[1.飛行機で、2.列車で、3.徒歩で]グース工場は会員、スーパー会員、ゴールド会員の3種類を導入[皮が違えば割引も違う]諸葛孔明錦の計画

戦略モードでは、3つの役割があります。

<テーブル 番号 文字 説明 1 環境(コンテキスト)ロール ストラテジーへの参照を保持する 2 抽象的な戦略の役割 これは抽象的な役割で、通常インターフェースか抽象クラスで実装される。この役割は、具象ストラテジークラスに必要なすべてのインタフェースを提供します。 3 ConcreteStrategyの役割 関連するアルゴリズムや振る舞いをラップする。

UML

概要

長所

ポリシーパターンは、オープン・クローズの原則を完全にサポートしており、ユーザーは元のシステムを変更することなくアルゴリズムや動作を選択したり、新しいアルゴリズムや動作を柔軟に追加したりすることができる。継承関係を置き換えることができるアルゴリズムの関連ファミリーを管理する方法を提供します。複数の条件付き転送文の使用を避けることができる。

デメリット

クライアントはすべてのポリシークラスを把握し、どれを使うかを自分で決めなければならない ポリシーパターンでは多くのポリシークラスが作成されることになるが、ヘドニックパターンを使えば、オブジェクトの数をある程度減らすことができる

package main
import "fmt"
/*Travel method*/
type Itravel interface {
	travel()
}
/* Aircraft*/
type Aircraft struct{}
/*Train*/
type Train struct{}
/*Walking*/
type Walk struct{}
/* Concrete strategy class 1: Aircraft travel*/
func (this Aircraft) Travel() {
	fmt.Println("Aircraft travel")
}
/* Concrete strategy class 2: Train travel*/
func (this Train) Travel() {
	fmt.Println("Train travel")
}
/* Concrete strategy class 3: Walk travel*/
func (this Walk) Travel() {
	fmt.Println("Walk travel")
}
/* Environment class*/
type User struct {
	Name string
	Itravel Itravel
itravel }
func (this User) travel() {
	fmt.Printf("%s", this.Name)
	this.Itravel.Travel()
}
func main() {
	user := User{"Zhang San", Aircraft{}}
	user.travel()
	user = User{"Li Si", new(Train)}
	user.travel()
	user = User{"Wangwu", &Walk{}}
	user.travel()
}


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