Design patterns 使用decorator时的设计折衷

Design patterns 使用decorator时的设计折衷,design-patterns,wrapper,decorator,Design Patterns,Wrapper,Decorator,有一个具有以下伪代码的现有功能 class MyMessageSink implements MessageSink { public void sendToFulfillment(); } 现在,我想向sendToFulfillment方法添加事务和锁定功能。我使用包装器模式完成了这项工作 class TransactionalMessageSink{ private MessageSink sink; public TransactionalMess

有一个具有以下伪代码的现有功能

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();
    }
这里的问题很明显,锁定代码和事务代码之间存在紧密耦合,但避免了为简单功能创建另外两个类

我个人喜欢第一种方法,但仍然不相信这是最好的方法

我的问题-除了使用包装器之外,还有没有更好的方法,即在单个类中处理这些问题而不影响设计方面的有效方法。

听起来像是您需要的。如果您使用的是Java,请查看


事务和其他“方面”(如日志记录)被称为横切关注点,需要在多个设计和抽象中实现。AOP可以用来自动用样板文件包装您的方法,以执行事务或日志记录等。

谢谢,我认为这完全符合这里的要求。但是,考虑一下,假设这些不是系统需求(如事务、日志),而是应用程序需求——在这种情况下,AOP仍然是最佳选择吗?因为我相信AOP主要用于实现系统需求,而不是应用程序需求