Android開発のテンプレートモデルの初探査
テンプレートモデルはAndroidの開発で最も長く使われていると思いますが、基本的には随所に見られます.このモデルを認識することは、Androidのソースコードとフレームワークをより深く認識するのに役立ちます.テンプレートモードとは何か、テンプレートモードは基本フレームワークを定義し、そのいくつかの方法をサブクラスに遅延して実装します.例えば、私たちがレストランに行って食事をすると、基本的なステップは必ず席を見つけて、料理を注文して、料理を出して、食事をして、注文の5つの過程を買って、その中で料理を注文するこの過程は可変で、私たちが注文した料理はどれだけ少なくて、その他はすべて固定して、それでは私たちは1つの固定した抽出類の中で1つの基本的な枠組みを形成することができて、私たちのサブクラスはこの抽象類を継承して、その中で可変の方法を複写する.
次に例を見てみましょう.
飲料を製造するテンプレートクラスを定義し、その中でprepareBeverageTemplate()メソッドのキーワードがfinalであることに注意し、サブクラスが可視のメソッドしか修正できないことを保証し、テンプレートフレームワークの安定性を保証し、サブクラスの実現を必要とするメソッドをProtected属性と定義し、抽象クラスとしてサブクラスが自由に発揮することを保証しなければならない.Androidの各クラスがActivityクラスを継承し、その中のoncreate()メソッドを複写するように、その属性もprotectedです.サブクラスで表示したくないメソッドは、privateプロパティとして位置づけ、メソッドボディを書く必要があります.
また、テンプレートフレームワークの柔軟性を高め、サブクラスで書き換えることで、メソッドを実行する必要があるかどうかを判断するisCustomerWantsCondiments()メソッドを定義していることもわかります.
私たちはお茶を入れるクラスを書いて、hook方法をfalseに戻して、飲み物を調製する第4歩をキャンセルしました.
では、テンプレートクラスをいつ使用する必要がありますか?
(1)アルゴリズムや操作が類似の論理に従う場合
(2)再構築時(同じコードを親に抽出する)に,プログラムの多重性を高める.
(3)重要で複雑なアルゴリズム,コアアルゴリズムをテンプレートアルゴリズムとして設計する
次に例を見てみましょう.
/*
* ,
*
*
*/
public abstract class RefreshBeverage {
/*
*
*
*/
public final void prepareBeverageTemplate(){
// 1
boilWater();
// 2
brew();
// 3
pourInCup();
if(isCustomerWantsCondiments()){
// 4
addCondiments();
}
}
/*
* Hook, ,
*
*
*/
protected boolean isCustomerWantsCondiments() {
return true;
}
/*
* ,
*/
private void boilWater() {
System.out.println(" ");
}
/*
* ,
*/
private void pourInCup() {
System.out.println(" ");
}
/*
* ,
*/
protected abstract void brew();
/*
* ,
*/
protected abstract void addCondiments();
}
飲料を製造するテンプレートクラスを定義し、その中でprepareBeverageTemplate()メソッドのキーワードがfinalであることに注意し、サブクラスが可視のメソッドしか修正できないことを保証し、テンプレートフレームワークの安定性を保証し、サブクラスの実現を必要とするメソッドをProtected属性と定義し、抽象クラスとしてサブクラスが自由に発揮することを保証しなければならない.Androidの各クラスがActivityクラスを継承し、その中のoncreate()メソッドを複写するように、その属性もprotectedです.サブクラスで表示したくないメソッドは、privateプロパティとして位置づけ、メソッドボディを書く必要があります.
また、テンプレートフレームワークの柔軟性を高め、サブクラスで書き換えることで、メソッドを実行する必要があるかどうかを判断するisCustomerWantsCondiments()メソッドを定義していることもわかります.
public class Tea extends RefreshBeverage {
@Override
protected void brew() {
System.out.println(" 80 5 ");
}
@Override
protected void addCondiments() {
System.out.println(" ");
}
@Override
/*
*
* @see com.imooc.pattern.template.RefreshBeverage#isCustomerWantsCondiments()
*/
protected boolean isCustomerWantsCondiments(){
return false;
}
}
私たちはお茶を入れるクラスを書いて、hook方法をfalseに戻して、飲み物を調製する第4歩をキャンセルしました.
では、テンプレートクラスをいつ使用する必要がありますか?
(1)アルゴリズムや操作が類似の論理に従う場合
(2)再構築時(同じコードを親に抽出する)に,プログラムの多重性を高める.
(3)重要で複雑なアルゴリズム,コアアルゴリズムをテンプレートアルゴリズムとして設計する