在项目中遇到这么一个问题,相信很多做过一点架构设计的都遇到过。
以一个最常用的工作流为例,有审批者——被审批的申请--审批动作
按照面向对象思想,应该是先new 一个审批者,审批者执行审批动作
Auditer auditer=new Auditer("John");
Apply oneApply=new HolidayApply();//休假 HolidayApply:Apply
auditer.Audit(oneApply);
public class Auditer
{
private string uid;
public Auditer(string userid)
{uid= userid;}
public bool Audit(Apply)
{...}
}
如果我们审批的不是休假,而是业务招待费呢,那么
public bool Audit(Apply)
{ switch(xx)
{case "A":
...
case B :
..}}是一种方案,但如果申请几十个上百个就很难维护了
与其如此,我们把Audit这个方法移到被审批的申请这个对象中
Auditer auditer=new Auditer("John");
Apply oneApply=new HolidayApply();//休假 HolidayApply:Apply
oneApply.BeAudit(auditer);
这样就很简单的解决了这个问题
在现实中,理论上应该这样表达
public class Auditer
{
private string uid;
public Auditer(string userid)
{uid= userid;}
public bool Audit(Apply apply)
{apply.BeAudit(uid)}
} 即审批者依赖于被审批申请,
由于使用关系数据库为主等原因,我们把对象属性称为实体,把对象行为集合在一起成为对象的类
这或许就是当前中庸之道的选择吧
推出适合的道理,对象自身的属性放在对象本类中
如果两个对象作用,这一动作放在被改变的对象类中
都被改变了的话,分解这一动作,小明给墙刷红色油漆;结果墙变成了红色,油漆桶里面的油漆变少了。
Wall.ChangeColor("red");
OilBucket.Reduce(100);
即是分别放在各自对象类中。