GoF四人组一共介绍了23种面向对象的设置模式,为每一种特定的实现取了一个名字,根据模式的应用目的不同,将他们分为3类,创建型、结构性和行为型。
面向对象设计三原则:
优先使用组合
针对接口编程
为变化而设计
设计模式不是万能的,熟悉了这些模式,灵活运用它,并且不局限于设计模式,构架出适合自己的设计才是最重要的。
在工作流系统的开发中,后台的类是纯面向对象的方式实现的,因此少不了设计模式的运用:
单例模式:
读取数据库配置文件 fcconfig.xml
读取工作流相关的配置文件 fcworkflow.xml
读用户系统的配置文件 fcuser.xml
这种读取配置文件,返回多个属性值的,用单例模式,确保系统中只有一个实例在运行。
获取表的最大id号,用的是静态方法,因为只需要获取一个值。
静态方法和单例模式有区别:静态方法在系统运行后,就已经运行了,是一个方法,只有一个返回值。
单例模式是在需要获取这个流程实例的时候,才初始化这个类,返回的是一个类的实例。
工厂模式:
配置多数据库的支持;
配置流程的多种存储方式;
配置用户系统的多种实现方式
....
很多实现都能看到工厂模式的影子,大部分的实现都是采用 工厂模式+可配置的参数 来实现的。
外观模式,代理模式:
外观模式是在系统的封装好了功能前面再加一道入口门。在eworkflow中用户系统的对外提供统一的入口,有点类似外观模式。
代理模式:
资源的延迟访问。
为对象提供一个代理来控制对该对象的访问。
适配器模式:
在流程的表达式分析中,有用到适配器模式,系统提供了一套分析表达式的方法。也可以切换成其它的(用户自定义的)表达式分析器类。
装饰器模式:
比较常见的是在web请求后,加上拦截器或者是过滤器。
复合模式:
有多层次嵌套的上下级关系的节点,在实现的时候,采用了复合模式来达到一个递归的调用。就是在父层次的抽象类中,定义了节点有共性的属性。在子层次的类中,用一个集合来记录父层次类的实例个数,再通过遍历这个集合来达到递归出所有嵌套子节点的个数。
命令模式:
web请求的时候,所有的页面请求方式用命令模式来封装,达到统一的调用。
策略模式:
所有的节点的前置后置函数,都实现一个接口,接口提供一个方法,这个方法流程引擎中会调用。前置后置函数可以是一些业务函数。
所有的条件判断函数,也都是实现了一个统一的接口,接口提供一个判断方法,这个方法在流程引擎中会调用。 只要实现这个接口,用户可以自己写业务规则。
模版方法:这种在很多父层次的抽象类中,经常有实现。
观察者模式:在将自定义表单(eform)和eworkflow工作流的集成中,有类似使用观察者模式。在表单业务数据的提交后,产生事件,通知到工作流系统中,工作流系统接到通知后,将执行流程的动作提交,达到流程递进。
....
可能上面的归纳不是很准确,但是对接口编程,为变化而设计 这种思想贯穿了整个流程开发。还是那句话,设计模式不是万能的,能提炼出共性,符合使用设计模式的,使得复杂的处理更加简单了,就可以使用。
<script type="text/javascript"></script>