享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
posts - 213, comments - 2315, trackbacks - 162, articles - 45
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何让Visitor变得可爱2

Posted on 2005-01-19 21:36  idior  阅读(...)  评论(...编辑  收藏

   上文提到如何使得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
    
{
        
    }


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

    }

}

 

 

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

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


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


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

 

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

我个人想了几个:

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

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

3.      报表的输出。

4.      工资的计算等等。

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

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


参考资料  《agile software develop》