面向对象设计与实用的思考(主动对象与被动对象)

在项目中遇到这么一个问题,相信很多做过一点架构设计的都遇到过。

以一个最常用的工作流为例,有审批者——被审批的申请--审批动作

按照面向对象思想,应该是先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);

即是分别放在各自对象类中。

原文地址:https://www.cnblogs.com/tobase/p/3613897.html