用于实现事务或链接机制的设计模式

Jac*_*ian 10 c# java design-patterns

我在C#和Java中实现了一个简单的Factory类.此类构建具有同一个接口的具体工作类的实例.特别是所有这些类都有如下方法:

create
select
alter
etc.
Run Code Online (Sandbox Code Playgroud)

现在我想要一个机制(建立在一些经典/非经典模式之上),这将允许我创建这些方法的"链"或将它们封装在一种事务中.在伪代码中,我希望看到类似的东西:

Transaction tnx = create(...args...).alter(...args_2...);
//tnx.Execute();
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

Transaction tnx;
tnx.Start();
tnx.Add(method_name, ... variable list of arguments ...);
tnx.Add(another_method_name, ... variable list of arguments ...);
tnx.Execute();
Run Code Online (Sandbox Code Playgroud)

我不擅长设计模式,我不确定使用什么模式.我希望有人可以分享和删除几行代码(在C#或Java中),这些代码将演示如何实现它.谢谢!

Mat*_*zer 7

工作单元是表示域事务的正确模式.

它累积更改(添加,更新和删除),并且可以原子接受或丢弃它们.通过实施整个工作单元来保证原子性,并且实现者必须确保变更被持久化或原子地丢弃.

检查Martin Fowler如何在他的模式目录中定义它:

维护受业务事务影响的对象列表,并协调写入更改和并发问题的解决方案.

工作单元模式的可能接口可以是:

public interface IUnitOfWork
{
     void Commit();
     void Rollback();
}
Run Code Online (Sandbox Code Playgroud)

您还可以在界面中添加以下方法:

// Note I've added a generic type parameter to define what kind of
// objects will handle the whole unit of work
public interface IUnitOfWork<TObject>
{
     void RegisterNew(TObject some);
     void RegisterUpdated(TObject some);
     void RegisterDeleted(TObject some);
     void Commit();
     void Rollback();
}
Run Code Online (Sandbox Code Playgroud)

总之,所有更新应使用由工作单位monitorized变化跟踪处理,以及一些增加删除太:

  • 如果将新对象添加到与其他对象(1-n关联)关联的集合中,则工作单元应该能够检测到该对象是脏的并且应该持久化而不需要手动告知工作单元这样做.

  • 删除相同.如果从1-n关联中删除对象而没有其他对象引用它(孤立对象),则应自动将其标记为已删除.

大多数数据映射器(如OR/M框架)已使用对象代理实现对象更改跟踪以拦截属性集调用.


das*_*ght 6

当您对部分-整体系统进行建模时,复合模式是一种显而易见的选择。以下是模式图的外观:

复合图案

鉴于您有一个生产相同接口对象的工厂,您几乎完成了复合模式的实现。

  • 您的工厂生产符合某些接口的对象。此接口是复合实现的组件接口。
  • 您的工厂生成具体类,这些类表示Leaf复合实现中的类。

唯一留给您构建的Composite类就是类。

假设您的Component界面如下所示:

public interface IComponent {
    void Create();
    void Alter();
    void Execute();
}
Run Code Online (Sandbox Code Playgroud)

那么你的复合类Transaction可能如下所示:

public class Transaction : IComponent {
    private readonly IList<IComponent> components = new List<IComponent>();
    public void Add(IComponent c) {
        components.Add(c);
    }
    void Create() {
        foreach (var c in components) {
            c.Create();
        }
    }
    void Alter() {
        foreach (var c in components) {
            c.Alter();
        }
    }
    void Execute() {
        foreach (var c in components) {
            c.Execute();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)