以下の疑似コードを持つ既存の機能があります
class MyMessageSink implements MessageSink {
public void sendToFulfillment();
}
ここで、メソッドにトランザクションとロック機能を追加したいと思いsendToFulfillment
ます。ラッパーパターンを使用してこれを行いました
class TransactionalMessageSink{
private MessageSink sink;
public TransactionalMessageSink(MessageSink sink){
this.sink = sink;
}
public void sendToFulfillment(){
//start transaction
sink.sendToFulfillment();
//end transaction
}
}
同様に、私は を作成しLockingMessageSink
、クライアント コードは次のようになりました。
new LockingMessageSink(new TransactionalMessageSink(new MyMessageSink())).sendToFulfillment
ただし、トランザクションとロックのコードは非常に少なく、シンプルで簡単です (定型的な作業のほとんどを行うフレームワークを使用しているため)。だから私は別のアプローチを考えました-
class MyMessageSink implements MessageSink {
public void lockAndSendToFulfillmentInTransaction(){
//locking start
sendToFulfillmentInTransaction();
//locking end
}
public void sendToFulfillmentInTransaction(){
//transaction start
sendToFulfillment();
//transaction end
}
public void sendToFulfillment();
}
ここでの問題は明らかです。ロックとトランザクション コードの間には密接な結合がありますが、単純な機能のために 2 つの追加クラスを作成することを避けています。
私は個人的に最初のアプローチが好きですが、これが最良のアプローチであるとはまだ確信していません.
私の質問 - Wrapper を使用する以外に良い方法はありますか。つまり、設計面で妥協することなく単一のクラスでこれらを処理する効率的な方法はありますか。