闘争は必ずしもお金のためだけでなく、自信、落ち着き、そして骨の落ち着きもあります!私は好きなものを買う余裕があり、行きたい場所に行き、責任を負い、お金を使い、生きることができます。A質の高い生活!かけがえのない自分になりましょう!
定義
テンプレートメソッドパターンは、アルゴリズムのステップを定義し、サブカテゴリが1つ以上のステップの練習を提供できるようにします。アルゴリズムアーキテクチャを変更せずに、サブカテゴリでアルゴリズムのいくつかのステップを再定義します。ソフトウェアエンジニアリングでは、これはソフトウェアデザインパターンであり、C ++テンプレートとは関係ありません。
デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
—1 / 15/2021
使用するシーン
豆乳を作りたい、まず最初に必要なもの:
- 大豆を準備する
- 小豆、大豆、黒豆を準備する
- 氷砂糖を追加する
- 豆乳に磨き上げた
それは大まかにこれらのステップに分けられます。
豆乳の製造工程は基本的に同じですが、材料が異なります。小豆豆乳を飲みたい、小豆を入れて、大豆ペーストを飲みたい、大豆を入れて、やっとできますロックシュガーを追加するかしないかを選択します。テンプレートメソッドモードがあります。
思考分析
テンプレートメソッドパターンは、テンプレートを定義することによってコードフローを標準化することです
UML类图(1.1)
:
ATemplate抽象メソッドを定義して豆乳の製造プロセスを標準化することにより、そのサブクラスBlackSoybeanMilkImplは、配置する豆の種類を実装します。ここに黒豆を配置すると、黒豆乳が得られます。
役割分析
- ATemplate(抽象クラス):テンプレートはクラスに実装され、全体的なコード思考スケルトンが定義され、特定のコードサブクラスが実装されます。
- BlackSoybeanMilkImpl(実装クラス):特定のコードを実装します
- クライアント:クライアントは実装クラスを直接呼び出し、次にポリモーフィックメカニズムを使用して親クラスのテンプレートメソッドを呼び出します
コード
ATemplate抽象クラスは、コード仕様を定義します。
public abstract class ATemplate {
//用来规范豆浆流程
void aemplate() {
soybean();//准备黄豆
addBean();//添加豆子
sugar(); //准备冰糖
polish(); //打豆浆
}
//准备黄豆
private void soybean() {
Log.i("模板方法模式 ","准备黄豆");
}
//添加豆子
public abstract void addBean();
//准备冰糖
private void sugar() {
Log.i("模板方法模式 ","放入冰糖");
}
//打豆浆
private void polish() {
Log.i("模板方法模式 ","开始打磨豆浆 预计10分钟完毕");
}
}
BlackSoybeanMilkImpl黒豆の実装:
public class BlackSoybeanMilkImpl extends ATemplate{
@Override
public void addBean() {
Log.i("模板方法模式 ","放入 黑豆浆");
}
}
RedSoybeanMilkImpl大豆の実装:
public class RedSoybeanMilkImpl extends ATemplate{
@Override
public void addBean() {
Log.i("模板方法模式 ","放入 红豆浆");
}
}
クライアント(テストコード):
//制作黑豆浆
ATemplate blackSoybeanMilk = new BlackSoybeanMilkImpl();
blackSoybeanMilk.aemplate();
Log.i("模板方法模式 "," ===========================");
//制作红豆浆
RedSoybeanMilkImpl redSoybeanMilk = new RedSoybeanMilkImpl();
redSoybeanMilk.aemplate();
Log图(2.1)
:
フックメソッドの理解
それでも上記の例では、砂糖を含まない純粋な豆乳を飲みたい場合は、ここでフックを使用します。」
フックメソッド関数:特定のコードを実行するかどうかを識別します。
フックコードの実装
ATemplateはフックメソッドisSugar()を追加します:
public abstract class ATemplate {
//用来规范豆浆流程
void aemplate() {
soybean();//准备黄豆
addBean();//添加豆子
if (isSugar()) {
sugar(); //准备冰糖
}
polish(); //打豆浆
}
//准备黄豆
private void soybean() {
Log.i("模板方法模式 ", "准备黄豆");
}
//添加豆子
public abstract void addBean();
//准备冰糖
private void sugar() {
Log.i("模板方法模式 ", "放入冰糖");
}
//打豆浆
private void polish() {
Log.i("模板方法模式 ", "开始打磨豆浆 预计10分钟完毕");
}
//默认加糖 钩子方法
public boolean isSugar() {
return true;
}
}
PureSoybeanMilkImpl純粋な豆乳の生産:
フックメソッド()を書き直して、砂糖なしに変更します。
public class PureSoybeanMilkImpl extends ATemplate{
@Override
public void addBean() {
Log.i("模板方法模式 ","我这里什么都不加,我要喝纯豆浆");
}
//不加糖
@Override
public boolean isSugar() {
return false;
}
}
クライアント(テストコード):
//制作黑豆浆
ATemplate blackSoybeanMilk = new BlackSoybeanMilkImpl();
blackSoybeanMilk.aemplate();
Log.i("模板方法模式 "," ===========================");
//制作红豆浆
RedSoybeanMilkImpl redSoybeanMilk = new RedSoybeanMilkImpl();
redSoybeanMilk.aemplate();
Log.i("模板方法模式 "," ===========================");
//制作纯豆浆 使用钩子 不加糖
PureSoybeanMilkImpl pureSoybeanMilk = new PureSoybeanMilkImpl();
pureSoybeanMilk.aemplate();
Log图(2.2)
:
総括する:
-
テンプレートメソッドパターンは比較的単純です。つまり、コードフローは抽象クラスを介して標準化され、変更が必要な特定の場所は抽象メソッドとして記述され、そのサブクラスに実装されます。
-
フックは、テンプレートメソッド抽象クラスの「メソッド変数」であり、特定のコードを実行するかどうかを識別します。
オリジナリティは簡単ではありません、あなたの好きなものは私にとってあなたの最大のサポートです〜