Существует существующую функциональность с ниже псевдокодеDesign компромисс в использовании декоратора
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, то есть любой эффективный способ справиться с ними в одном классе без ущерба для дизайна.
Спасибо, я думаю, что это идеально подходит для законопроекта. Однако, думая впереди, полагая, что это не системные требования (например, транзакция, ведение журнала) и были скорее требованиями приложения - в этом случае AOP по-прежнему будет лучшим выбором? поскольку я считаю, что АОП в основном используется для внедрения Системных требований, а не требований к приложениям – user1339772