首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用装饰器时的设计折衷

问使用装饰器时的设计折衷
EN

Stack Overflow用户
提问于 2013-10-11 21:44:18
回答 1查看 43关注 0票数 1

下面的伪代码有一个现有的功能

代码语言:javascript
复制
class MyMessageSink implements MessageSink {
        public void sendToFulfillment();
}

现在,我想向sendToFulfillment方法添加事务和锁定功能。我是用包装器模式做的

代码语言:javascript
复制
class TransactionalMessageSink{
      private MessageSink sink;
      public TransactionalMessageSink(MessageSink sink){
                this.sink = sink;
          }
       public void sendToFulfillment(){
            //start transaction
            sink.sendToFulfillment();
            //end transaction     
        }
}

类似地,我创建了一个LockingMessageSink,客户机代码变成

代码语言:javascript
复制
new LockingMessageSink(new TransactionalMessageSink(new MyMessageSink())).sendToFulfillment

但是,事务和锁定代码非常少、简单和简单(因为我们使用的是一个框架,它为我们完成了大部分样板工作)。所以我想到了另一种方法-

代码语言:javascript
复制
class MyMessageSink implements MessageSink {
            public void lockAndSendToFulfillmentInTransaction(){
                    //locking start
                     sendToFulfillmentInTransaction();
                    //locking end
            }

            public void  sendToFulfillmentInTransaction(){ 
                     //transaction start
                      sendToFulfillment();
                     //transaction end
            }
            public void sendToFulfillment();
    }

这里的问题很明显,锁和事务代码之间存在着紧密的耦合,但避免了为简单功能创建两个额外的类。

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

我的问题是,除了使用包装器之外,还有其他更好的方法吗?即,在不影响设计方面的情况下,在单个类中处理这些问题的任何有效方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 22:27:34

听起来你需要面向方面编程。如果您正在使用Java,请看一看AspectJ

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19327742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档