`
java-mans
  • 浏览: 11529622 次
文章分类
社区版块
存档分类
最新评论

LN项目重构之职责链模式

 
阅读更多

LN项目截止到昨天为止算是彻底的完工了,功能实现方面没有问题,但是这个一星期出来的“早产儿”还是有很多其他问题,比如代码的重复量过高、各个类之间耦合太大。整个系统中虽然用到了分层的思想,但是基本上BLL层的代码是一致的,也就是说如果需求改动(比如增加审核的部门,或者原先的部门审核顺序进行调整)则需要改动整个的BLL层。

现在整个系统的架构如下图所示:


整体上的架构没什么问题,经典的MVC。其实这次做的系统有点四不像,宏观的看是MVC但是具体到Model层我们又走了.Net中的三层架构的老路子,这就导致了每个servlet对应各自的bll,于是就造成了bll层的重复代码太多。

Duplicate Code(重复代码)是代码的坏味道之一(“代码的坏味道”——引用自《》)。

于是……

通过对整个LN系统的分析可以看出来这个系统就是一个职责链,首先是用户填写申请信息,然后由各个部门一级一级的进行审批,最终得到通过(或者进行驳回)。尽管和经典的设计模式当中的职责链模式不是一模一样但是不影响我们用职责链模式对系统进行重构。

尝试用职责链模式重构BLL层之后的部分类图如下图:


根据从数据库得来的各个部门的签署意见,将这些意见赋值到实体类中,根据这些意见判断此次申请被那些部门审核过,同时判断审核是否通过。这里简化代码没有涉及DAL以及SqlHelper的代码部分,只将结果进行打印输出,核心代码如下:


public class Chain
{
	public static void main(String arg[])
	{
		//构造各个部门(级别)的类
		abstracBll levelone=new levelOne();
		abstracBll leveltwo=new levelTwo();
		abstracBll levelthree=new levelThree();
		//设定各个部门之间的上下级关系
		levelone.setManager(leveltwo);
		leveltwo.setManager(levelthree);
		//实例化申请类(实例化实体类)
		entityApplication enApplication=new entityApplication();
		enApplication.suggestion1="同意";
		enApplication.suggestion2="同意";
		enApplication.suggestion3="同意";
		//开始由最低级的部门进行判断该申请是否能通过
		levelone.apply(enApplication);
	}
}
//抽象的B层类
abstract class abstracBll
{
	protected abstracBll level;
	//申请的抽象方法
	public abstract void apply(entityApplication application);
	//设定处理此次申请的部门
	public void setManager(abstracBll level)
	{
		this.level=level;
	}
}


//第一级部门所对应的类
class levelOne extends abstracBll
{
	public void apply(entityApplication application)
	{
		//判断第一级签署意见是否是同意,如果同意则转入下一级别进行再次判断,否则表示此申请被驳回
		if(application.suggestion1=="同意")
		{
			System.out.println("第一级同意");
			level.apply(application);			
		}
		else
		{
			System.out.println("被第一级驳回!");
		}
	}
}


//第二级部门所对应的类
class levelTwo extends abstracBll
{
	public void apply(entityApplication application)
	{
		if(application.suggestion2=="同意")
		{
			System.out.println("第二级同意");
			level.apply(application);

		}
		else
		{
			System.out.println("被第二级驳回!");
		}
	}
}


//第三级部门所对应的类
class levelThree extends abstracBll
{
	public void apply(entityApplication application)
	{
		//判断最后一级是否通过审核,如果通过则表示此审核通过审核,否则表示最后一级没有通过
		if(application.suggestion3=="同意")
		{			
			System.out.println("第三级同意,此审核通过!");
		}
		else
		{
			System.out.println("被第三级驳回!");
		}
	}
}


//申请的实体类
class entityApplication
{
	public String suggestion1;
	public String suggestion2;
	public String suggestion3;
}



运行结果如下图:


通过重构后如果系统在原来的基础上增加或者调整部门的先后审核顺序则只需要增加bll类或者调整servlet中对bll层的先后调用关系即可。这样的话无需改动整个的B层,而且可以清晰的看到在servlet调用Bll的时候只需要操纵整条职责链中的第一个链即可,不与其他的类发生关系,大大的降低了耦合,提高了代码的复用性,有利于后期的维护(蓝色部分为面向对象的套话)。

分享到:
评论

相关推荐

    Linux的文件链接和ln命令

    简介: Linux强大的文件链接可以让我们轻松做到以下几点: 1、多用户之间的文件共有、数据共享; 2、不同版本的程序环境或数据源之间的切换;...3、ln 命令 4、文件链接的应用 5、Windows下“目录链接”的实现

    LN4871器件规格书

    为了保证便携式设备的电池的续航能力,当LN4871使能端接VDD时,芯片进入关断模式,该模式下IQ(Typ.)。 LN4871专门为需要大功率输出和高保真要求的便携式产品所设计。仅需很少的外部元件,专用于高品质音频功率放大。...

    ln的软硬连接区别

    ln的软硬连接区别

    ln命令 为文件创建链接

    ln命令是linux系统中一个非常重要命令,英文全称是“link”,即链接的意思,它的功能是为某一个文件在另外一个位置建立一个同步的链接。 一种是hard link,又称为硬链接;另一种是symbolic link,又称为符号链接。 ...

    LN5R05C电源IC数据手册

    LN5R05C电源IC的厂家手册,我的博客中的一款消防应急灯使用了此电源IC

    linux命令:ln使用方法.docx

    Linux 命令:ln 使用方法 Linux 命令:ln 使用方法是一篇关于 Linux 命令 ln 的使用方法的详细指南。该命令的主要功能是创建文件之间的链接,包括硬链接和软链接两种类型。 ln 命令的基本格式为:ln [options] ...

    北阳激光传感器UST-05LN资料.pdf

    北阳激光传感器UST-05LN

    北阳传感器UST-05LN手册

    北阳传感器UST-05LN手册,详细介绍此款传感器相关参数。

    LLC增益和频率、Q、Ln关系曲线.rar_LLC增益和频率、Q、Ln关系曲线_LLC曲线_headednru_llc Ln_m

    LLC GAIN VS FSW,Ln,Q, MATHCAD

    X10SLH-LN6TF / X10SLH-LN6-ST031 说明书

    X10SLH-LN6TF / X10SLH-LN6-ST031 英文说明书

    LN298N驱动芯片资料说明

    LN298N资料,希望对大家有帮助 The L298 is an integratedmonolithic circuit in a 15- lead Multiwatt and PowerSO20 packages. It is a high voltage, high current dual full-bridge driver designedto ...

    开关电源原理图和PCB图LN8K04 SOP-8 小家电用

    开关电源原理图和PCB图LN8K04 SOP-8 小家电用

    Infor Worktop ERP LN v2.5

    Infor ERP LN适用的客户端软件Worktop

    开源项目-fogleman-ln.zip

    开源项目-fogleman-ln.zip,三维线艺术引擎

    计算Ln(x)的值

    该程序主要计算Ln(x)的值,采用Taylor法和Richardson外推法进行计算。

    超微X9DRI-LN4F+最新BIOS

    超微服务器主板X9DRI-LN4F+最新原版BIOS,3.3版本,更新的功能包括:Updated SATA RAID/SCU OPROM/EFI driver to RSTe PreOS v4.6.0.1018 (RSTe SATA 4.6.0.1091 and NVMe 4.6.0.2127)

    超微X9DRi_3-LN4F+说明书

    超微服务器主板X9DRi_3-LN4F+说明书,X9DR3-LN4F+和X9DRi-LN4F+通用,USER’SMANUAL Revision 1.0b,

    LN2053_C.pdf

    LN2053 是可以对单节可充电锂电池和磷酸铁锂电池进 行恒流/恒压充电的充电管理芯片。该器件内部包括功率晶体 管,应用时不需要外部的电流检测电阻和阻流二极管。 LN2053 只需要极少的外围元器件,并且符合 USB 总线...

    电机驱动 ln289

    恒压恒流桥式2A驱动芯片L298N L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。可以方便的驱动两个直流电机,或一个两相步进电机。

    Tornado\ln97xEnd

    Tornado\ln97xEnd vxworks在vm上的网卡驱动

Global site tag (gtag.js) - Google Analytics