`

对象关系行为模式之工作单元

阅读更多

一、概念

Unit of Work:维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。其UML结构大致如下:

工作单元记录在业务事务过程中对数据库有影响的所有变化。操作结束后,作为一种结果,工作单元了解所有需要对数据库做的改变,统一对数据库操作。

 

 

二、为什么要使用工作单元?

如果没有使用工作单元,可以在每次修改对象模型时对数据库对得相应修改,但这样会产生大量规模很小的数据库调用,从而导致速度变慢。而且这样做还需要有一个对整个交互过程都开放的事务,如果存在一个贯穿多个请求的业务事务,这就是不合实际的。如果还要记录读过的对象以避免不致读,那么情况会更糟。

引发处理数据库的原因就是变化:创建新对象和更新或删除已经存在的对象。工作单元就是一个记录这些变化的对象。只要开始做一些可能会对数据库有影响的操作,就创建一个工作单元去记录这些变化。每当创建、改变或者删除一个对象时,就通知此工作单元。也可以让此单元知道所读过的对象,通过验证在整个业务事务处理过程中数据库中的所有对象都没有改变,从而检查一致读。

 

 

三、实现工作单元

对象行为关系模式之标识映射代码中加入

static function addDelete( DomainObject $obj ) {
        $self = self::instance();
        $self->delete[$self->globalKey( $obj )] = $obj;
    }


    static function addDirty( DomainObject $obj ) {
        $inst = self::instance();
        if ( ! in_array( $obj, $inst->new, true ) ) {
            $inst->dirty[$inst->globalKey( $obj )] = $obj;
        }
    }

    static function addNew( DomainObject $obj ) {
        $inst = self::instance();
        // we don't yet have an id
        $inst->new[] = $obj;
    }

    static function addClean(DomainObject $obj ) {
        $self = self::instance();
        unset( $self->delete[$self->globalKey( $obj )] );
        unset( $self->dirty[$self->globalKey( $obj )] );

        $self->new = array_filter( $self->new, 
                function( $a ) use ( $obj ) { return !( $a === $obj ); } 
                );
    }

    function performOperations() {
        foreach ( $this->dirty as $key=>$obj ) {
            $obj->finder()->update( $obj );
        }
        foreach ( $this->new as $key=>$obj ) {
            $obj->finder()->insert( $obj );
        }
        $this->dirty = array();
        $this->new = array();
    } 

ObjectWatcher类仍然是一个标识映射,但增加了跟踪系统中所有对象的功能(通过$all)。

通过addDirty方法,将“脏”(就是被修改了)对象保存在$dirty数组中,直到更新数据库。

通过addClean方法,把“脏”对象标识为“干净”的,这样数据库就不会更新。

通过addNew方法,将新创建的对象添加到$new数组中,该数组中的对象将会被插入到数据库中。

通过performOperations方法,遍历$dirty和$new数组,更新或添加对象。

 

 

四、小结

工作单元解决的基本问题是记录操作过的各种对象,以便知道为了使内存中的数据与数据库同步需要考虑哪些对象。如果能够在一个系统事务中做完所有的工作,则只需要考虑那些改变了的对象。尽管一般来说,工作单元是解决这个问题的最好途径,但还有其他方法。

 

也许最简单的方法是,在修改任何一个对象时就显式地保存该对象,但是带来的问题是可能使用的数据库调用比预想的多。如果操作过程中在三个不同的地方改变了同一个对象,最终会产出三次数据库调用,而不是一次。

 

要避免多重数据库调用,可以把对数据库的更新操作放在最后。为了做到这一点,需要记录已经改变的所有对象。可以在代码中用变量来实现记录跟踪,但是一旦变量很多,变量很快就变得难以管理。一般来说,变量与事务脚本运行得很好,但很难与领域模型一起使用。

 

把每个所改变的对象加上“脏”标志的做法要比把对象保存在变量中好。在事务处理完后,需要找出所有加了“脏”标记的对象并把它们写入到数据库中。这项技术的价值取决于寻找“脏”对象的难易程序。如果所有的“脏”对象都在一个单一层次结构上,就可以遍历该层结构来向数据库写入所有被改变了的对象。然而,跨越一个更一般的对象网络(如一个领域模型)是比较困难的。

 

工作单元的强大功能是把所有的信息保存在一个地方。一旦使用了工作单元,就不必为记录所做的修改做很多操作。而且,工作单元还可以作为更复杂情况下的固定处理平台。

 

 

 


 

2
0
分享到:
评论

相关推荐

    软件设计模式作业三行为式模式

    南华大学的这个作业主要探讨了五种行为模式:职责链模式、组合命令模式、中介者模式、备忘录模式和观察者模式,同时也涉及到了UML类图和代码规范。 1. 职责链模式:这种模式允许将请求沿着处理者链进行传递,直到...

    分析模式-可复用的对象模型

    责任模式属于行为型设计模式之一,其目的是实现将请求的发送者和接收者解耦,让多个对象都有机会处理请求。在观察者模式中,对象之间的一对多依赖关系被建立,当一个对象改变状态时,所有依赖于它的对象都会收到通知...

    《C#面向对象设计模式纵横谈》.pdf

    例如观察者模式定义了对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会收到通知;策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。 #### 面向对象设计模式的实践 设计...

    分析模式可复用的对象模型

    7. **观察者模式**:观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在构建动态、响应式的系统时非常有用。 8. **策略模式**:策略模式...

    QT4面向对象编程与设计模式

    - **观察者模式**:实现对象之间的发布-订阅关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知。 - **装饰器模式**:动态地给对象添加新的行为或职责,不改变其原始接口。 - **代理模式**:为其他对象...

    Geliang_单元测试模式与重构v1.

    通过遵循正确的单元测试实践,如避免不必要的测试、编写有目的性的测试用例以及采用对象工厂模式等,我们可以大大提高软件开发的效率和质量。希望本文档能为您的单元测试实践提供有价值的指导。

    JUnit单元测试原则 单元测试工具

    - 这样可以避免因对象间的复杂关系而引起的混淆。 2. **给测试方法起有意义的名字**: - 测试方法的命名应遵循`testXXXYYY()`的格式。 - 其中`XXX`表示被测试的方法名,`YYY`表示测试的状态或条件。 3. **明确...

    java设计模式之面向对象的思想(think in OO(Object Oriented))

    6. 观察者模式(Observer Pattern):观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。它体现了事件驱动的编程思想。 7. 装饰器模式...

    设计模式概述及23种设计模式

    17. 状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 18. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可将该...

    DapperUnitOfWorkk:Dapper工作单元模式

    在.NET开发领域,Dapper是一个轻量级的数据库访问库,它提供了高效的SQL查询操作,而工作单元(UnitOfWork)模式是设计模式中的一个,用于管理多个数据库操作的事务边界。当我们谈论"DapperUnitOfWorkk"时,它是一个...

    Java软件设计模式[最详尽=面向对象+编程原则+设计模式].rar

    - **观察者模式**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 本教程通过PPT形式,结合案例分析,不仅涵盖了设计模式的基本概念,还深入探讨了...

    UML类图及、7大设计原则、23种设计模式

    行为型模式关注对象之间的通信,规定了对象的行为,包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。 通过学习和应用这些...

    实用面向对象软件工程教程

    活动图则关注系统内流程和工作流,帮助我们理解系统的动态行为。 面向对象设计是将分析模型转化为具体实现的桥梁。OOD强调设计模式的使用,如工厂模式、单例模式、观察者模式等,这些模式为常见问题提供了标准解决...

    设计模式精解(GoF 23 种设计模式解析)

    行为模式 **3.1 Template Method模式** - **定义**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **应用场景**:当一个算法的...

    java面向对象的设计方法

    其次,对象是类的实例,是程序中的基本工作单元。通过“new”关键字,我们可以根据类创建出对象,并为对象分配内存空间。每个对象都有其唯一的标识,可以通过引用来访问和操作对象。 封装是面向对象的三大特性之一...

    常用设计模式及Java程序 pdf

    - **管理对象间的交互**:例如观察者模式允许对象之间动态地定义一对多依赖关系,适配器模式则用于让不兼容的接口协同工作。 - **控制复杂性**:代理模式可以在客户端和目标对象之间提供一个中介层,简化客户端与...

    面向对象分析设计OOAD.zip

    面向对象分析与设计(Object-Oriented Analysis and Design,简称OOAD)是软件工程领域中的一种重要方法,它强调在软件开发过程中,以对象作为基本的思考和组织单元,通过分析问题域中的实体及其相互关系,来构建...

Global site tag (gtag.js) - Google Analytics