大话设计模式(带目录完整版)[中文PDF+源代码].zip
下载地址:http://pan.baidu.com/s/1giQP4
大话设计模式C++.pdf
下载地址:http://pan.baidu.com/s/1ABbBv
大话设计模式C++源码
下载地址:http://pan.baidu.com/s/1yzLBl
----------------------------------------------
刚刚看了访问者模式,复杂问题简单化。
class Node
{
accept(Visitro *pVisitor);
}
class Visitor
{
apply(Node *pNode){pNode->fun();}
}
------------------------------------------------
url:http://greatverve.cnblogs.com/p/Design-patterns-down.html
访问者模式的目的: 封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
问题的提出:System.Collection命名空间下提供了大量集合操作对象。平时我们大多在集合中都是存储的同类型对象,像2.0中的泛型中就规定集合中只能存储指定的对象类型,要么是整形要么是字符型等,否则会报错。如果针对一个保存有不同类型对象的聚集采取某种操作该怎么办呢?
示例:假设有一个员工报销的集合,里面存储了员工姓名和报销金额情况,而报销数据类型并不统一,有的是整形的,有的是双精度的,有的是字符串型,我们要做的就是根据具体的数据类型给出不同的显示格式,例如在整型数据后面加一个"C",(是我自己想的,整型的符号一时没想起来),在双数度数据后面加一个"D",浮点数据后面加"F",而字符串则什么也不加。
传统实现方式:遍历集合中的元素,判断元素类型,然后做相应的处理。代码如下:会发现就会出现必须对元素类型做类型判断的条件转移语句,如果判断多了,要想维护起来也并不容易。此时可考虑采用访问者模式。
_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:被访问的类结构非常稳定的情况下使用。系统很少出现需要加入新节点的情况。如果出现需要加入新节点的情况,那么就必须在每一个访问对象里加入一个对应于这个新节点的访问操作,而这是对一个系统的大规模修改,因而是违背"开一闭"原则的。
访问者模式的结构: