zoupaper的个人博客分享 http://blog.sciencenet.cn/u/zoupaper

博文

设计模式与现代C++ 连载(三)

已有 2311 次阅读 2019-3-22 13:43 |系统分类:科研笔记

7 访问者模式

访问者模式大约是23种经典设计模式中对象耦合最紧密的,但它的存在必然有自己的道理。它可以在某个对象结构(体系)上定义新的操作,就好比已有一个东西了,有多个访问者,每个访问者做不同的事情。

下面举电力系统的例子。状态估计是能量管理系统的核心模块,其计算完成后,结果表现为潮流(包括节点电压、线路功率等)和残差(与原始数据的差)。我们做工业级的软件,不可能只给用户这些东西,而是要对已有的状态估计结果做进一步加工处理,然后呈现给用户。

标准的状态估计的用户界面展示,至少有以下内容:系统潮流(包括具体设备、按照地区统计,以及全网的潮流信息);越限/重载设备(包括单个的排序及其统计信息);量测分析(包括大误差点、可疑数据和坏数据、合格率统计等)。

这些东西说起来简单,实现起来还是有许多技术细节的。然后再考虑不同的用户有不同的个性化需求:比如说,有的用户不仅仅是针对单个断面的分析结果,还需要结合历史的断面动态的分析;有的用户有个性化的统计需求,用于考核基层单位的合格率。

如果这些大量的、不同种类的需求都与核心计算程序混在一起,那么一个庞然大物就出现了,程序的维护工作量大幅度提升。如果把针对状态估计结果的后续处理代码写成一个个访问者,访问者都可以动态增加、组合,那么可以使得程序结构清晰。

下面给出示例,这个示例是用bind/function实现的,没有继承,全部是具体的类。

首先是具体类(其中Accept是开放给对外的访问接口):



然后是一个访问者,访问者可以增加:


最后是测试代码:


8 组合模式

   前面讲的几个模式都是行为类模式,我在实现过程中都是用bind/funtion来取代了继承,获得了最大的松耦合特性。但是对于创建型和结构型模式来说,继承有时候还是无法避免的。

   组合模式是结构型模式的一种,对我个人的帮助极大。有效简化了嵌套型结构的处理。具体代码就不上了。比如说,微电网内部还有微电网,控制器内部还有控制器。组合模式需要与别的模式配合才能发挥最大威力。比如说,对外提供迭代器接口、对外提供访问者接口。还有我在命令模式举的例子,用于子模块建模与计算分离的技术,与组合模式一起,可以轻松解决复杂的问题。

9 创建型模式

   创建型模式我用到较多的是单例模式,毕竟有些资源是不可以复制的。另外,任何程序对于日志记录,最好都是以单例模式来写。

   其它的创建型模式,例如工厂方法等,创建的对象一般都是指向继承系统的基类。我C++编程推崇尽可能不用继承,绝大多数类都是具体类,由bind/function实现灵活多态和对象间配合。如果完全没有继承,则工厂方法等创建型模式就没有用武之地了。

   我有个不成熟的想法,如果我们创建的不是普通对象,而是function对象,由function对象实现多态,然后基类工厂可以被继承。那么创建型模式也可以照样使用,只不过暂时还没有这方面的经验。




https://blog.sciencenet.cn/blog-3316223-1169012.html

上一篇:设计模式与现代C++ 连载(二)
下一篇:设计模式与现代C++ 连载(四)
收藏 IP: 218.94.96.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-27 04:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部