现有的功能包含以下伪代码
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 :(得分:0)
听起来你需要Aspect Oriented Programming。如果您使用的是Java,请查看AspectJ
交易和其他“方面”(如日志记录)被称为需要在多个设计和抽象中实施的交叉问题。 AOP可用于通过样板自动包装您的方法来进行事务或记录等。