2013-10-11 2 views
1

Существует существующую функциональность с ниже псевдокоде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, то есть любой эффективный способ справиться с ними в одном классе без ущерба для дизайна.

ответ

0

Похоже, вам нужно Aspect Oriented Programming. Если вы используете Java, посмотрите на AspectJ

Сделки и другие «аспекты», такие как ведение журнала, известны как сквозные проблемы, которые необходимо реализовать в нескольких проектах и ​​абстракциях. AOP можно использовать для автоматической упаковки ваших методов с помощью шаблона для совершения транзакций или ведения журналов и т. Д.

+0

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

Смежные вопросы