乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
2007-05-27 15:04
615 查看
[索引页]
[源码下载]
[align=center]乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)[/align]
作者:webabcd
介绍
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
示例
有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要针对其中某一方法进行操作。
![](http://blog.51cto.com/attachment/201007/201007051278343214968.png)
MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message实体类
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="msg">Message内容</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="pt">Message发布时间</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public MessageModel(string msg, DateTime pt)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._message = msg;
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._publishTime = pt;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
private string _message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message内容
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public string Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _message; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _message = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
private DateTime _publishTime;
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message发布时间
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public DateTime PublishTime
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _publishTime; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _publishTime = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 抽象元素(Element)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract string Accept(AbstractVisitor abstractVisitor);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 操作Message抽象类(Element)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class Message : AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
private MessageModel _messageModel;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public Message(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._messageModel = mm;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message实体对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public MessageModel MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _messageModel; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _messageModel = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Accept(AbstractVisitor abstractVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
return abstractVisitor.Visit(this);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract List<MessageModel> Get();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract bool Insert();
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
SqlMessage
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Sql方式操作Message(ConcreteElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class SqlMessage : Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public SqlMessage(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
: base(mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override List<MessageModel> Get()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
List<MessageModel> l = new List<MessageModel>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return l;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override bool Insert()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
// 代码略
![](http://blog.51cto.com/images/editer/InBlock.gif)
return true;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
XmlMessage
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Xml方式操作Message(ConcreteElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class XmlMessage : Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public XmlMessage(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
: base(mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override List<MessageModel> Get()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
List<MessageModel> l = new List<MessageModel>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
l.Add(new MessageModel("XML方式获取Message", DateTime.Now));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return l;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override bool Insert()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
// 代码略
![](http://blog.51cto.com/images/editer/InBlock.gif)
return true;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 抽象访问者(Visitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象元素的方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract string Visit(AbstractElement abstractElement);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
InsertVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Insert访问者(ConcreteVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class InsertVisitor : AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行Message的Insert()方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Visit(AbstractElement abstractElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Message m = abstractElement as Message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return m.Insert().ToString() + "<br />";
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
GetVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Get访问者(ConcreteVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class GetVisitor : AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行Message的Get()方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Visit(AbstractElement abstractElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Message m = abstractElement as Message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString() + "<br />";
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Messages
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message集合(ObjectStructure)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class Messages
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
private List<Message> _list = new List<Message>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 添加一个Message对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="message">Message对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public void Attach(Message message)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
_list.Add(message);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 移除一个Message对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="message">Message对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public void Detach(Message message)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
_list.Remove(message);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行集合内所有Message对象的Accept()方法(执行抽象访问者的Visit()方法(从而执行抽象元素的方法))
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public string Accept(AbstractVisitor abstractVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
string s = "";
![](http://blog.51cto.com/images/editer/InBlock.gif)
foreach (Message m in _list)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
s += m.Accept(abstractVisitor);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return s;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Test
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Data;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Configuration;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.Security;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.WebControls;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.WebControls.WebParts;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.HtmlControls;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
using Pattern.Visitor;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
public partial class Visitor : System.Web.UI.Page
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
protected void Page_Load(object sender, EventArgs e)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Pattern.Visitor.Messages m = new Pattern.Visitor.Messages();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
m.Attach(new SqlMessage(new MessageModel("插入", DateTime.Now)));
![](http://blog.51cto.com/images/editer/InBlock.gif)
m.Attach(new XmlMessage(new MessageModel("插入", DateTime.Now)));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
Response.Write(m.Accept(new InsertVisitor()));
![](http://blog.51cto.com/images/editer/InBlock.gif)
Response.Write(m.Accept(new GetVisitor()));
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
运行结果
True
True
SQL方式获取Message 2007-5-27 15:01:53
XML方式获取Message 2007-5-27 15:01:53
参考
http://www.dofactory.com/Patterns/PatternVisitor.aspx
OK
[源码下载]
[源码下载]
[align=center]乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)[/align]
作者:webabcd
介绍
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
示例
有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要针对其中某一方法进行操作。
![](http://blog.51cto.com/attachment/201007/201007051278343214968.png)
MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message实体类
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="msg">Message内容</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="pt">Message发布时间</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public MessageModel(string msg, DateTime pt)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._message = msg;
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._publishTime = pt;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
private string _message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message内容
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public string Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _message; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _message = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
private DateTime _publishTime;
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message发布时间
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public DateTime PublishTime
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _publishTime; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _publishTime = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 抽象元素(Element)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract string Accept(AbstractVisitor abstractVisitor);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 操作Message抽象类(Element)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class Message : AbstractElement
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
private MessageModel _messageModel;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public Message(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
this._messageModel = mm;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message实体对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public MessageModel MessageModel
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
get { return _messageModel; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
set { _messageModel = value; }
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Accept(AbstractVisitor abstractVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
return abstractVisitor.Visit(this);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract List<MessageModel> Get();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract bool Insert();
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
SqlMessage
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Sql方式操作Message(ConcreteElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class SqlMessage : Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public SqlMessage(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
: base(mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override List<MessageModel> Get()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
List<MessageModel> l = new List<MessageModel>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return l;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override bool Insert()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
// 代码略
![](http://blog.51cto.com/images/editer/InBlock.gif)
return true;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
XmlMessage
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Xml方式操作Message(ConcreteElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class XmlMessage : Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 构造函数
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="mm">Message实体对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public XmlMessage(MessageModel mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
: base(mm)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 获取Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override List<MessageModel> Get()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
List<MessageModel> l = new List<MessageModel>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
l.Add(new MessageModel("XML方式获取Message", DateTime.Now));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return l;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 插入Message
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override bool Insert()
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
// 代码略
![](http://blog.51cto.com/images/editer/InBlock.gif)
return true;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 抽象访问者(Visitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract class AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行抽象元素的方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public abstract string Visit(AbstractElement abstractElement);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
InsertVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Insert访问者(ConcreteVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class InsertVisitor : AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行Message的Insert()方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Visit(AbstractElement abstractElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Message m = abstractElement as Message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return m.Insert().ToString() + "<br />";
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
GetVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Get访问者(ConcreteVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class GetVisitor : AbstractVisitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行Message的Get()方法
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractElement">抽象元素</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public override string Visit(AbstractElement abstractElement)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Message m = abstractElement as Message;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return m.Get()[0].Message + " " + m.Get()[0].PublishTime.ToString() + "<br />";
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Messages
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections.Generic;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Text;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
namespace Pattern.Visitor
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// Message集合(ObjectStructure)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public class Messages
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
private List<Message> _list = new List<Message>();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 添加一个Message对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="message">Message对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public void Attach(Message message)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
_list.Add(message);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 移除一个Message对象
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="message">Message对象</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public void Detach(Message message)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
_list.Remove(message);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// 执行集合内所有Message对象的Accept()方法(执行抽象访问者的Visit()方法(从而执行抽象元素的方法))
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// </summary>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <param name="abstractVisitor">抽象访问者</param>
![](http://blog.51cto.com/images/editer/InBlock.gif)
/// <returns></returns>
![](http://blog.51cto.com/images/editer/InBlock.gif)
public string Accept(AbstractVisitor abstractVisitor)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
string s = "";
![](http://blog.51cto.com/images/editer/InBlock.gif)
foreach (Message m in _list)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
s += m.Accept(abstractVisitor);
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
return s;
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
Test
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Data;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Configuration;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Collections;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.Security;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.WebControls;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.WebControls.WebParts;
![](http://blog.51cto.com/images/editer/InBlock.gif)
using System.Web.UI.HtmlControls;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
using Pattern.Visitor;
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
public partial class Visitor : System.Web.UI.Page
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
protected void Page_Load(object sender, EventArgs e)
![](http://blog.51cto.com/images/editer/InBlock.gif)
{
![](http://blog.51cto.com/images/editer/InBlock.gif)
Pattern.Visitor.Messages m = new Pattern.Visitor.Messages();
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
m.Attach(new SqlMessage(new MessageModel("插入", DateTime.Now)));
![](http://blog.51cto.com/images/editer/InBlock.gif)
m.Attach(new XmlMessage(new MessageModel("插入", DateTime.Now)));
![](http://blog.51cto.com/images/editer/InBlock.gif)
![](http://blog.51cto.com/images/editer/InBlock.gif)
Response.Write(m.Accept(new InsertVisitor()));
![](http://blog.51cto.com/images/editer/InBlock.gif)
Response.Write(m.Accept(new GetVisitor()));
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
![](http://blog.51cto.com/images/editer/InBlock.gif)
}
运行结果
True
True
SQL方式获取Message 2007-5-27 15:01:53
XML方式获取Message 2007-5-27 15:01:53
参考
http://www.dofactory.com/Patterns/PatternVisitor.aspx
OK
[源码下载]
相关文章推荐
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
- 二十六.行为型设计模式——Visitor Pattern(访问者模式)
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
- C# 设计模式-访问者(Visitor)
- 设计模式(行为型)之访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
- 设计模式笔记24:访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 二十四种设计模式:访问者模式(Visitor Pattern)
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 乐在其中设计模式(C#) - 组合模式(Composite Pattern)
- 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)
- [设计模式]访问者模式(visitor pattern)