翔如菲菲

其实天很蓝,阴云总会散;其实海不宽,此岸连彼岸.

导航

如何让Visitor变得可爱2

本文转自:http://www.cnblogs.com/idior/articles/94368.html

上文提到如何使得visitor模式更具扩展性,本来想针对各音频文件改名做一个Visitor, 不过想想觉的这个例子也不是很好,自己也没接触过媒体方面的东东,也不知道加些什么功能好,就换了各例子。这个例子跟毕设有关,当时做要做一个工作流建模工具,可就是不知道怎么才能将根据图形生成XML文件的功能加进去。如果在每个图形元素中都加入ToXml的方法,虽然能实现,但是却违反了单一责任的原则,这个行为和图形元素本身并无太大关系,今天就突然想到可以用Visitor来实现它。

   下面就让我动手吧。


如果你看过我的上一片随笔,相信应该能看懂这副图了吧。

一切就是这么简单。下面给出源代码。

using System;
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
    
{
        
    }


    
#region Element
    
public class Node :Element
    
{
        
public  override void Accept(ElementVisitor v)
        
{
            NodeVisitor nv
=as NodeVisitor;

            
if (nv!=null)
            
{
                nv.Visit(
this);
            }

        }

    }


    
public class Edge :Element
    
{
        
public Edge(Node n1,Node n2)
        
{
             
//
        }

        
public  override void Accept(ElementVisitor v)
        
{
            EdgeVisitor nv
=as EdgeVisitor;

            
if (nv!=null)
            
{
                nv.Visit(
this);
            }

        }

    }


    
public class Graph:Element
    
{
        IList elements
=new ArrayList();
  
        
public override void Accept(ElementVisitor v)
        
{
            GraphVisitor nv
=as GraphVisitor;

            
if (nv!=null)
            
{
                nv.Visit(
this);
            }

            
foreach (Element e in this.elements)
            
{
                e.Accept(v);
            }

        }


        
public void Add(Element e)
        
{
            elements.Add(e);
        }


        
public void Remove(Element e)
        
{
            elements.Remove(e);
        }

    }


    
#endregion


    
#region ElementVisitor

    
public interface NodeVisitor
    
{
        
void Visit(Node n); 
    }


    
public interface EdgeVisitor
    
{
        
void Visit(Edge n); 

    }


    
public interface GraphVisitor
    
{
        
void Visit(Graph n); 
    }


#endregion


    
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());
            
        }

    }

}

 

 

这里就用到了VisitorObjectStructure. 在这个例子里,Visitor模式的强大显露无疑,我们终于看到了一个可爱的Visitor的应用。

如果你想添加一个Note元素,简单!


如果想不让Note出现在XML文件中
,同样简单!


如果你要以其他形式输出,比如
CSV格式那你只要再写一个CSVVisitor就可以了,写到这里你应该感觉到Visitor模式的可爱了吧。

 

Visitor模式在我们平时的应用中又有哪些应用呢?

我个人想了几个:

1.      一份数据要以不同的形式表现出来。

2.      程序初始化的时候,建立一份初始化的数据,然后根据不同的情况交由不同的Visitor来进行初始化工作。

3.      报表的输出。

4.      工资的计算等等。

这些场合下似乎都可以让Visitor模式一展身手,大家也发表一下意见。

其实对于每个模式大家都可以发表一下自己的看法,这样我们在什么时候使用模式,就会有更好的选择。
 

posted on 2010-11-18 15:38  翔如飞飞  阅读(225)  评论(0)    收藏  举报