关闭

老生常谈:访问者模式

发表于:2011-3-18 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
DotNet

  访问者模式的目的:封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

  问题的提出:System.Collection命名空间下提供了大量集合操作对象。平时我们大多在集合中都是存储的同类型对象,像2.0中的泛型中就规定集合中只能存储指定的对象类型,要么是整形要么是字符型等,否则会报错。如果针对一个保存有不同类型对象的聚集采取某种操作该怎么办呢?

  示例:假设有一个员工报销的集合,里面存储了员工姓名和报销金额情况,而报销数据类型并不统一,有的是整形的,有的是双精度的,有的是字符串型,我们要做的就是根据具体的数据类型给出不同的显示格式,例如在整型数据后面加一个“C”,(是我自己想的,整型的符号一时没想起来),在双数度数据后面加一个“D”,浮点数据后面加“F”,而字符串则什么也不加。

  传统实现方式:遍历集合中的元素,判断元素类型,然后做相应的处理。代码如下:会发现就会出现必须对元素类型做类型判断的条件转移语句,如果判断多了,要想维护起来也并不容易。此时可考虑采用访问者模式。

ArrayList _arr = new ArrayList();
            _arr.Add(
"一百元");
            _arr.Add(
100);
            _arr.Add(
150.5);
            
foreach  (object o in _arr )
            {
                
if (o is string)
                {
                    Console.WriteLine(o.ToString());
                }
                
else if (o is double)
                {
                    Console .WriteLine (o.ToString ()
+" D");
                }
                
else if (o is Int32)
                {
                    Console.WriteLine(o.ToString()
+" C");
                }
            
            }

  访问者模式适用性:

  1、数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

  2、被访问的类结构非常稳定的情况下使用。系统很少出现需要加入新节点的情况。如果出现需要加入新节点的情况,那么就必须在每一个访问对象里加入一个对应于这个新节点的访问操作,而这是对一个系统的大规模修改,因而是违背“开一闭”原则的。

  访问者模式的结构:

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号