首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

工作单元方式

2013-04-02 
工作单元模式package test.hella.unitworkpublic interface IUnitOfWork{void registerAdded(Object enti

工作单元模式
package test.hella.unitwork;public interface IUnitOfWork{ void registerAdded(Object entity); void registerChanged(Object entity); void registerRemoved(Object entity); void commit();}

?然后是接口实现:

package test.hella.unitwork;import java.util.ArrayList;import java.util.List;public class UnitOfWork implements IUnitOfWork {    private List<Object> newObjects = new ArrayList<Object>();    private List<Object> dirtyObjects = new ArrayList<Object>();    private List<Object> removedObjects = new ArrayList<Object>();    public void registerAdded(Object entity) {        newObjects.add(entity);    }    public void registerChanged(Object entity) {        dirtyObjects.add(entity);    }    public void registerRemoved(Object entity) {        removedObjects.add(entity);    }    public void commit() {        insertNew();        updateDirty();        deleteRemoved();    }    private void insertNew() {        for (Object newObj : newObjects) {            //DO insert        }    }    private void updateDirty() {        for (Object dirtyObj : dirtyObjects) {            //DO update        }    }    private void deleteRemoved() {        for (Object removedObj : removedObjects) {            //DO delete        }    }}

?调用着的调用方式:

package test.hella.unitwork;public class UnitOfWorkTest {    private static final UserRepository userRepository = new UserRepository();    public static void main(String[] args) {        User user1 = new User(1,"user1");        IUnitOfWork unitOfWork = new UnitOfWork();        unitOfWork.registerRemoved(user1);        User user2 = userRepository.getUser(2);        user2.changeName("user2Changed");        unitOfWork.registerChanged(user2);        User user3 = userRepository.getUser(3);        unitOfWork.registerRemoved(user3);        unitOfWork.commit();    }}

?2. 对象注册:

对象注册的方式,调用者无需负责注册,注册方法被置于对象方法中。

还以上面的代码距离,此时User对象需要负责注册:

package test.hella.unitwork;public class User {    private final long id;    private String name;    public long getId() {        return id;    }    public User(long id, String name) {        this.id = id;        this.name = name;    }    public void changeName(String name, IUnitOfWork unitOfWork) {        this.name = name;        unitOfWork.registerChanged(this);    }}

?调用者无需再向工作单元进行注册。很明显看到上例中需要将工作单元传递给User对象,这种传递显得不够简洁,更好的方式是将工作单元放到一个众所周知的地方来解决这个问题,比如java的ThreadLocal。

?

package test.hella.unitwork;import java.util.ArrayList;import java.util.List;public class UnitOfWork implements IUnitOfWork {    private List<Object> newObjects = new ArrayList<Object>();    private List<Object> dirtyObjects = new ArrayList<Object>();    private List<Object> removedObjects = new ArrayList<Object>();    private static ThreadLocal current = new ThreadLocal<UnitOfWork>();    public static void newCurrent() {        setCurrent(new UnitOfWork());    }    public static void setCurrent(UnitOfWork now) {        current.set(now);    }    public static UnitOfWork getCurrent() {        return (UnitOfWork) current.get();    }    public void registerAdded(Object entity) {        newObjects.add(entity);    }    public void registerChanged(Object entity) {        dirtyObjects.add(entity);    }    public void registerRemoved(Object entity) {        removedObjects.add(entity);    }    public void commit() {        insertNew();        updateDirty();        deleteRemoved();    }    private void insertNew() {        for (Object newObj : newObjects) {            //DO insert        }    }    private void updateDirty() {        for (Object dirtyObj : dirtyObjects) {            //DO update        }    }    private void deleteRemoved() {        for (Object removedObj : removedObjects) {            //DO delete        }    }    }

?

?

3. 工作单元控制器:

这种方式调用者和DomainObject都无需小心翼翼的记得向工作单元注册变化。工作单元控制所有的数据读取,读取数据之后会产生一个拷贝,提交时按照对象的唯一标识和拷贝的对象进行对比,如果有变化则更新数据库中的数据。

?

?

热点排行