上文提到如何使得visitor模式更具扩展性,本来想针对各音频文件改名做一个Visitor, 不过想想觉的这个例子也不是很好,自己也没接触过媒体方面的东东,也不知道加些什么功能好,就换了各例子。这个例子跟毕设有关,当时做要做一个工作流建模工具,可就是不知道怎么才能将根据图形生成XML文件的功能加进去。如果在每个图形元素中都加入ToXml的方法,虽然能实现,但是却违反了单一责任的原则,这个行为和图形元素本身并无太大关系,今天就突然想到可以用Visitor来实现它。
下面就让我动手吧。
如果你看过我的上一片随笔,相信应该能看懂这副图了吧。
一切就是这么简单。下面给出源代码。
using System.Collections;
namespace VisitorForXmlOutput.Element
{
public abstract class Element
{
protected string id;
public string GetId()
{
return id;
}
public abstract void Accept(ElementVisitor ev);
}
public interface ElementVisitor
{
}
Element
ElementVisitor
public class XMLVisitor :ElementVisitor,NodeVisitor,EdgeVisitor,GraphVisitor
{
//具体的有关读取图的信息并输出xml文件的实现就省略了
public void Visit(Node n)
{
// TODO: Add XMLVisitor.Visit implementation
}
public void Visit(Edge e)
{
// TODO: Add XMLVisitor.Visit implementation
}
public void Visit(Graph g)
{
// TODO: Add XMLVisitor.Visit implementation
}
}
public class Main
{
public static void Main(string []args)
{
Node n1=new Node();
Node n2=new Node();
Edge e1=new Edge(n1,n2);
Graph g=new Graph();
g.Add(n1);
g.Add(n2);
g.Add(e1);
g.Accept(new XMLVisitor());
}
}
}
这里就用到了Visitor的ObjectStructure. 在这个例子里,Visitor模式的强大显露无疑,我们终于看到了一个可爱的Visitor的应用。
如果你想添加一个Note元素,简单!
如果想不让Note出现在XML文件中,同样简单!
如果你要以其他形式输出,比如CSV格式那你只要再写一个CSVVisitor就可以了,写到这里你应该感觉到Visitor模式的可爱了吧。
Visitor模式在我们平时的应用中又有哪些应用呢?
我个人想了几个:
1. 一份数据要以不同的形式表现出来。
2. 程序初始化的时候,建立一份初始化的数据,然后根据不同的情况交由不同的Visitor来进行初始化工作。
3. 报表的输出。
4. 工资的计算等等。
这些场合下似乎都可以让Visitor模式一展身手,大家也发表一下意见。
其实对于每个模式大家都可以发表一下自己的看法,这样我们在什么时候使用模式,就会有更好的选择。
参考资料 《agile software develop》