`

连接两个模板方法模式?

 
阅读更多

昨天在客户现场,和香港一家公司的技术人员讨论了一个比较奇怪的技术方案。晚上仔细想了一下,发现这个方案可以用设计模式的概念抽象成下面的问题:

有两个已存在的模板方法(Template Method)模式,分别实现了一个特定的算法,算法的每个步骤可以自行定义,但算法的流程已经固定下来了。那么,在不允许改变模板方法,只允许改变特定步骤的情况下,如何把这两个算法连接起来,完成一个新的功能流程呢?

例 如,下图左边的算法A包含3个顺序执行的步骤,算法B包含4个步骤。如果只允许改变ConcreteClassA和ConcreteClassB中的 PrimitiveOperation...,该如何实现A1、B1、A2、A3、B2、B3、B4这样的流程?或另一种流程(但A和B各自的流程顺序总 保持不变)?甚至是省略某些步骤的流程,如A1、A2、B1、A3、B4?

显 然,两组算法之间需要某种同步手段。我们的解决方案是,用一组Agent类来定义新的流程,同时令其作为A和B两种算法的中介。这组Agent类本身大致 相当于一个策略(Strategy)模式。抽象的Agent类包含一个Process方法,具体的Agent类在Process方法中定义并执行特定的流 程。同时,Agent类中保存了算法A和算法B的进展状态信息(如算法已进展到哪一个步骤等)。

在具体实现层面,Process方法是一 个在后台一直运行的服务程序的主线程,它的基本思路是,根据特定的流程定义,定时查看算法A和算法B的状态,判断是否可以让算法A或算法B进入下一个步 骤。Agent本身有点像一个算法闸门,闸门开的时候,算法就可以继续,反之就必须阻塞。

为了实现闸门功能,Agent类提供了一个CanContinue方法,具体的算法步骤可通过该方法查询自己是否要继续执行。

有 了Agent类,实现具体的算法步骤时,我们需要为PrimitiveOperation...增添以下功能:在执行前通过Agent类的 CanContinue方法查询是否可执行此操作,如果可以就执行,如果不可以就阻塞(根据模板方法的实现方式不同,阻塞操作也有不同:或者用Sleep 方式挂起,或者向模板方法返回当前步骤无法执行,请稍后再试的信息),每个步骤执行完毕后,就通过Agent类完成状态更新操作。

保存算 法状态是这种思路的核心。为了保存全系统唯一的状态信息,Agent显然也应是一个单件类。此外,如果算法A、算法B、Agent不是部署在一台计算机 上,或者算法A、B的执行需要很长时间,中间甚至需要用户的参与,我们就必须将算法的状态保存在数据库、文件等永久存储中,以确保算法的完整性。所以,用 来保存算法状态的类PersistentState就与一个操作数据库的持久层相当类似。——这种使用持久层的做法,大概和教科书里讲过的,确保分布式事 务完整性的算法差不多。

整个思路如下图所示:

是 不是太抽象了,我一直没讲具体的应用。到底是什么样的系统才“不允许改变模板方法”呢?其实,我们碰到的是系统集成项目经常遇到的问题。我们要用两套成熟 的软件平台为客户搭建系统,一套平台负责后台服务,实现了可定制的工作流管理功能;一套平台负责前台数据处理,有用户参与,流程固定,但可以定制数据的输 出格式。这两套平台都用类似于插件的方式提供了二次开发接口,我们可以自己实现插件完成具体环节的特定操作,但定义并驱动功能流程的是平台本身而不是插 件。

在这种情况下,平台控制整个流程,它类似于模板方法,我们只能开发特定的操作环节,类似于实现 PrimitiveOperation...,如果前台和后台两个平台谁也不认识谁,不能相互兼容,平台本身又是大公司成熟的软件产品,无法修改,我们要 完成整个项目,并且要根据用户的要求实现特定的流程——这不就是如何连接两个模板方法模式的问题吗?

我也不大知道我们的解决方案是不是个 好的选择,反正我们成功地把前、后台两个系统连接了起来,还可以根据用户的需要随时修改业务流程,这个结果总是好的嘛。要说起这件事的起因,也挺让人生气 的,明明可以选择相互兼容的前、后台系统,客户为了摆平派系间的利益关系,偏要买两套不兼容的软件(老美的软件,价格还挺贵),同时还给我们出了这么一个 难题。不过,系统集成项目最吸引人的地方就是要解决不同系统间的平滑连接问题,问题越难,程序员自然越有干劲。

#sha zi发表于2004-08-31 18:04:00IP: 141.202.248.*
I can understand it fully. But from what you have described,it seems that the Agent and PrimitiveOperations should inquire the status periodically, if so, it is low efficient. Maybe Observer/Observable is more suitable.
分享到:
评论

相关推荐

    Delphi模式编程第一分卷

    一共两个压缩分卷,这是第一个分卷 第一部分 模式编程原理 第1章 模式概述 1.1 模式的概念 1.1.1 什么是模式 1.1.2 模式可以做什么 1.2 模式与架构 1.2.1 什么是架构 1.2.2 架构和模式的关系 1.3 从面向...

    Delphi模式编程第二分卷

    一共两个压缩分卷,这是第二个分卷 第一部分 模式编程原理 第1章 模式概述 1.1 模式的概念 1.1.1 什么是模式 1.1.2 模式可以做什么 1.2 模式与架构 1.2.1 什么是架构 1.2.2 架构和模式的关系 1.3 ...

    苹果CMS V10海螺模板主题下载 影视主题模板 本主题带后台

    6、分享链接采用短连接防封模式 7、可自行在后台开启多个广告位 使用说明: 上传模板至template目录内 进入后台打开首页 自定义菜单配置添加 海螺主题设置,/admin.php/admin/conch/theme 推荐PHP5.6~PHP7.2 需要安装...

    深入浅出设计模式(中文版)

    5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例...

    深入浅出设计模式(中文版电子版)

    5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    苹果CMS最新海螺模板v4.0完美修复版.zip

    海螺模板一直是苹果cms比较好看的模板。目前网络上有很多,这个是无错版本,都已修复!1、首页/分类幻灯片(后台自定义开启关闭) 2、首页logo可设置深色...6、分享链接采用短连接防封模式 7、可自行在后台开启多个广告位

    网络安全策略-范本模板.doc

    ( 2) 应用网关技术 网关技术一般工作在传输层, 在两个主机第一 次建立连接时创立一个电子屏障, 建立 两个t 连接. 连接建立之后, 数据包从一个连接向另一个连接发 送, 不用检查内容。 ( 3) 代理服务...

    java 面试题 总结

    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static ...

    Wordpress柚子皮主题5.62.zip

    两个菜单,右侧的菜单3和菜单4,新建完栏目或页面后,你就可以生成菜单,然后管理位置,把导航和菜单放到相应的位置即可。 4.小工具设置:5.32更新版的小工具请不要用“搜索”,因为已集成的模板。 5. 页面设置...

    s7-300工程实战总结.pdf

    59. CP342-5连接上位机软件或操作面板时应该选择什么工作模式? 15 60. 为什么系统上电后,即使CP342-5开关已经拨至Run,但始终处于STOP状态? 15 61. 如何用CP342-5组态PROFIBUS从站? 15 62. 如何用CP342-5组态...

    Visual C++编程技巧精选500例.pdf

    181 如何在两个执行程序间进行数据通信? 182 如何使用工作线程? 183 如何正常终止线程? 184 如何异常终止线程? 185 如何获取线程退出码? 186 如何使用线程优先级? 187 如何使用用户界面线程? 188 如何实现多线程多...

    超级有影响力霸气的Java面试题大全文档

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承...

    轻松下载 EasyDown v2.1 for Z-blog.rar

     V4:提供多模式地址查看页面(比如在本页面弹出窗口),扩展模板编辑,增加多模板(分类模板),美化系统  --------------------------------------------------------------------------------  模板:模板1,[不弹...

    labview实验报告(2).doc

    图1.4 练习2的流程图 该流程图中新增的对象有两个乘法器、两个数值常数、一个随机数发生器,温度和容 积对象是由前面板的设置自动带出来的。 乘法器和随机数发生器由Functions»Numeric中拖出,尽管数值常数也可以...

    MySQL数据库设计报告模板.doc

    维护以及前端应用程序的开发两个方面。 经过分析,我使用了 MICROSOFT公司的 VISUAL BASIC 6.0开发工具,利用其提供的各种面向对象的开发工具, 开发了登录模块主要用于验证用户身份,进行有效的操作。 在我们所开发的...

    家庭理财系统(1.0.0.19)

    保存两个对比图的显示模式; 1.0.0.17 添加网页收藏夹 1.0.0.18 调整界面颜色,规范窗体; 对话框窗体加上图标和快捷键; 1.0.0.19 加入计算本月预计支出和收入功能; 点击状态栏显示不同功能窗体; 不提供代码,因...

    asp.net知识库

    通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到...

    cms苹果-带主题--一体.zip

    可添加自定义菜单,多颜色选择,页面可黑白模式更换,后台seo自由填写,广告位随开随关,网站图标文件后台上传想换就换,首页模块自由搭配,幻灯片两款风格自主选择,二维码公众号开关自由,本模板附加功能 ...

Global site tag (gtag.js) - Google Analytics