テンプレートメソッドはクラスの動作パターンに属し、通常は安定したスケルトンを定義し、特定のコンテンツの実現はサブクラスに遅れます。
テンプレートメソッドの実現アイデア:安定した部分を実現し、実際のユーザーに変更しやすい部分を開きます。
テンプレートメソッドの一般的な例:継承、仮想関数など。
たとえば、JAVAでは、スレッドを使用してダウンロード機能を実装する場合と同様に、runメソッドを実装するためにスレッドを定義するだけで済みます。ライブラリ開発者にとっては、異なる機能を持つスレッドを実装する必要はなく、スレッドの実装は実際のアプリケーションの開発者に任されています。ライブラリ開発者は、「安定性とオープンな変更を実現する」というスレッドシステムスケジューリングなどの安定した操作を実装するだけで済みます。もちろん、アプリケーション開発者にとっては「変更部分」を自分で実装する必要があり、機能的に安定した部分の実現ロジックはアプリケーション開発者にとっては「ブラックボックス」です。JAVAスレッドを使用する場合、開発者は、ダウンロード関数がrunメソッドで記述されていることを知っていれば、「並行性、プロセスリソースの共有」の特性を同時に実現できます。
たとえば、図形の面積を計算するアプリケーションプログラムには、すでに長方形や三角形の面積を計算する機能があり、「面積を計算する機能を追加する必要があります。円」。
1つの方法は「グラフィックごとに独立したクラスを定義する」ことであり、2つ目は「グラフィックの抽象クラスを定義し、各グラフィックに抽象クラスを継承させる」ことです。「」
---------- 实现方式1-------------
class rectangular{
....
double area(){.....}
}
class triangle{
....
double area(){.....}
}
int main(){
if(type == "rectangular"){
rectangular r1;
...
r1.area() ;
}else if(type =='triangle'){
triangle t1;
...
t1.area();
}
return 0 ;
}
---------- 实现方式2-------------
class shape{
...
double area()=0;
}
class rectangular:public shape{
...
double area(){.....}
}
class triangle:public shape{
...
double area(){.....}
}
int main(){
rectangular r1;
...
r1.area() ;
return 0 ;
}
明らかに、前者のアプローチはこの新しい要件に直面しています。クラスエンティティを作成する必要があるだけでなく、実装プロセスも特定のタイプに応じてmainメソッドのプロセスを変更する必要があります。2番目のメソッドでは、ライブラリ開発者がシェイプクラスの定義の実現とメインメソッドの実現を担当します。実際のアプリケーション開発者は、この要件を満たすためにシェイプを継承するクラスを作成するだけで済みます。
テンプレートメソッドは、主に「変更」と「安定性」に関係しています。2つを分離し、変更された部分を抽出することは、このテンプレートメソッドのアイデアの鍵です。
もちろん、機能スケルトンのすべてのステップが最初から最後まで変更または安定している場合は、テンプレートメソッドを使用しないでください。