使用装饰器时的设计妥协

时间:2013-10-11 21:44:19

标签: design-patterns wrapper decorator

现有的功能包含以下伪代码

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之外,还有更好的方法,即在单一类中处理这些问题的任何有效方法,而不会影响设计方面。

1 个答案:

答案 0 :(得分:0)

听起来你需要Aspect Oriented Programming。如果您使用的是Java,请查看AspectJ

交易和其他“方面”(如日志记录)被称为需要在多个设计和抽象中实施的交叉问题。 AOP可用于通过样板自动包装您的方法来进行事务或记录等。