visitor是一个作用于某对象结构中各元素的操作。该模式可以在不改变各元素的前提下定义作用于这些元素的新操作。
把数据结构和对其的操作解耦,使得操作可以自由地添加。
ObjectStructure枚举需要被访问者操作的元素,枚举时每个element accept visitor就是在传入visitor并使其在其中调用逻辑方法。
...迭代器模式,分离了集合对象的遍历行为,抽象出一个迭代器类来负责遍历, 这样即可以做到不暴露集合内部结构,又可以让外部代码透明地访问集合内部数据。
aggregate负责收集聚合数据,然后交给iterator去操作遍历。
UnitOfWork 连接起了Controllers与Repositorys, Controllers(业务逻辑)只需要定义各种数据操作的逻辑,然后直接利用UnitOfWork commit change就可以了。而无需关心底层的数据库连接,追踪修改。
// IUnitOfWork 可供MVC里的Controllers作为构造函数参数使用
public interface IUnitOfWork{
IRepository<Employee> Employees{get;}
IRepository<TimeCard> TimeCards{get;}
void Commit();
}
public class SqlUnitOfWork: IUnitOfWork{
public SqlUnitOfWork(){
// 连接数据库 _context
}
public IRepository<Employee> Employees{
get{
if (_employees == null){
_employees = new SqlRepository<Employee>(_context);
}
return _employees;
}
}
public void Commit(){
_context.SaveChanges();
}
}
public class SqlRepository<T>: ISqlRepository<T> where T: class, Ientity{
public SqlRepository(ObjectContext context){
_objectSet = context.CreateObjectSet<T>();
}
public void Add(T newEntity){
_objectSet.AddObject(newEntity);
}
// other DB operations
}
定义一个操作中的算法股价,将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
即上升子类中重复代码到基类中
复杂的状态转换逻辑被分散到各个具体子状态对象中,然后根据context的具体需求,context上绑定的状态为其交接其他状态
将特定的状态相关的行为都放入一个对象内,由于所有与状态相关的代码都存在于某个ConcreteState内,所以通过定义新的子类就可以很容易地增加新的状态和转换。
要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上实现可能不同时,我们通常考虑用模板方法模式处理。
...