以前のテンプレートメソッドは冗長コードの問題を解決しますが、欠点も明らかです。継承されたすべてを受け入れるように強制することができるだけなので、この2番目のパターンデコレータパターンを使用します
まだ以前のビジネスロジックですが、今はこのように書くことができます
公開インターフェースCommand(){
public void excute();
}
//出力ロギングを実行するクラス
パブリッククラスPrintlogはCommand(){を実装します
コマンドcmd;
public Printlog(Command cmd){
this.cmd = cmd;
}
@オーバーライド
public void excute(){
//ログ
....
this.cmd.excute();
}
}
//クラスはパフォーマンス統計に使用されます
パブリッククラスパフォーマンスはCommand(){を実装します
コマンドcmd;
public Performance(Command cmd){
this.cmd = cmd;
}
@オーバーライド
public void excute(){
//パフォーマンス統計
.....
this.cmd.excute();
}
}
public PlaceOrderCommandはCommand(){を実装します
@オーバーライド
public void excete(){
//注文操作
}
}
psvm {
//今すぐ注文したいときにパフォーマンス統計を実行し、ログを印刷します
// Printlogを作成するために注文し、Performanceを作成するにはPerformanceが必要PlaceOrderCommandが必要
//最初にPlaceOrderCommandを作成してPerformanceに渡し、次にPerformanceを作成してPrintlogに渡します
// Printlogのexcete()メソッドを先に実行し、ログ操作を行ってからPerformanceのexecute()メソッドを呼び出して実行し、ログ操作を行った後にexecute()メソッドを実行する。
コマンドcmd = new Printlog(new Performance(new PlaceOrderCommand()));
cmd.excute()
//ログを出力するだけで、パフォーマンス統計を実行したくない場合
コマンドcmd = new Printlog(new PlaceOrderCommand());
cmd.excute();
}
デコレータはいくつでも使用でき、任意の順序で実行できます。最後のビジネスロジックは終わりです。ビジネスロジックを最初に実行してからデータをカウントする必要がある場合は、このメソッドの実行順序を変更するだけで済みます。