原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

作者:webabcd





介绍

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。





示例

有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要针对其中某一方法进行操作。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(string msg, DateTime pt)

        {

            this._message = msg;

            this._publishTime = pt;

        }



        private string _message;

        /**//// <summary>

        /// Message内容

        /// </summary>

        public string Message

        {

            get { return _message; }

            set { _message = value; }

        }



        private DateTime _publishTime;

        /**//// <summary>

        /// Message发布时间

        /// </summary>

        public DateTime PublishTime

        {

            get { return _publishTime; }

            set { _publishTime = value; }

        }

    }

}

AbstractElement

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// 抽象元素(Element)

    /// </summary>

    public abstract class AbstractElement

    {

        /**//// <summary>

        /// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)

        /// </summary>

        /// <param name="abstractVisitor">抽象访问者</param>

        /// <returns></returns>

        public abstract string Accept(AbstractVisitor abstractVisitor);

    }

}

Message

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// 操作Message抽象类(Element)

    /// </summary>

    public abstract class Message : AbstractElement

    {

        private MessageModel _messageModel;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        public Message(MessageModel mm)

        {

            this._messageModel = mm;

        }



        /**//// <summary>

        /// Message实体对象

        /// </summary>

        public MessageModel MessageModel

        {

            get { return _messageModel; }

            set { _messageModel = value; }

        }



        /**//// <summary>

        /// 执行抽象访问者的Visit()方法(从而执行抽象元素的方法)

        /// </summary>

        /// <param name="abstractVisitor">抽象访问者</param>

        /// <returns></returns>

        public override string Accept(AbstractVisitor abstractVisitor)

        {

            return abstractVisitor.Visit(this);

        }



        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public abstract List<MessageModel> Get();



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <returns></returns>

        public abstract bool Insert();

    }

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Sql方式操作Message(ConcreteElement)

    /// </summary>

    public class SqlMessage : Message

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        public SqlMessage(MessageModel mm)

            : base(mm)

        {

            

        }



        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public override List<MessageModel> Get()

        {

            List<MessageModel> l = new List<MessageModel>();

            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));



            return l;

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <returns></returns>

        public override bool Insert()

        {

            // 代码略

            return true;

        }

    }

}

XmlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Xml方式操作Message(ConcreteElement)

    /// </summary>

    public class XmlMessage : Message

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        public XmlMessage(MessageModel mm)

            : base(mm)

        {

 

        }



        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public override List<MessageModel> Get()

        {

            List<MessageModel> l = new List<MessageModel>();

            l.Add(new MessageModel("XML方式获取Message", DateTime.Now));



            return l;

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <returns></returns>

        public override bool Insert()

        {

            // 代码略

            return true;

        }

    }

}

AbstractVisitor

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// 抽象访问者(Visitor)

    /// </summary>

    public abstract class AbstractVisitor

    {

        /**//// <summary>

        /// 执行抽象元素的方法

        /// </summary>

        /// <param name="abstractElement">抽象元素</param>

        /// <returns></returns>

        public abstract string Visit(AbstractElement abstractElement);

    }

}

InsertVisitor

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Insert访问者(ConcreteVisitor)

    /// </summary>

    public class InsertVisitor : AbstractVisitor

    {

        /**//// <summary>

        /// 执行Message的Insert()方法

        /// </summary>

        /// <param name="abstractElement">抽象元素</param>

        /// <returns></returns>

        public override string Visit(AbstractElement abstractElement)

        {

            Message m = abstractElement as Message;



            return m.Insert().ToString() + "<br />";

        }

    }

}

GetVisitor

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Get访问者(ConcreteVisitor)

    /// </summary>

    public class GetVisitor : AbstractVisitor

    {

        /**//// <summary>

        /// 执行Message的Get()方法

        /// </summary>

        /// <param name="abstractElement">抽象元素</param>

        /// <returns></returns>

        public override string Visit(AbstractElement abstractElement)

        {

            Message m = abstractElement as Message;



            ].PublishTime.ToString() + "<br />";

        }

    }

}

Messages

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Visitor

{

    /**//// <summary>

    /// Message集合(ObjectStructure)

    /// </summary>

    public class Messages

    {

        private List<Message> _list = new List<Message>();



        /**//// <summary>

        /// 添加一个Message对象

        /// </summary>

        /// <param name="message">Message对象</param>

        public void Attach(Message message)

        {

            _list.Add(message);

        }



        /**//// <summary>

        /// 移除一个Message对象

        /// </summary>

        /// <param name="message">Message对象</param>

        public void Detach(Message message)

        {

            _list.Remove(message);

        }



        /**//// <summary>

        /// 执行集合内所有Message对象的Accept()方法(执行抽象访问者的Visit()方法(从而执行抽象元素的方法))

        /// </summary>

        /// <param name="abstractVisitor">抽象访问者</param>

        /// <returns></returns>

        public string Accept(AbstractVisitor abstractVisitor)

        {

            string s = "";

            foreach (Message m in _list)

            {

                s += m.Accept(abstractVisitor);

            }



            return s;

        }

    }

}

Test

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;



using Pattern.Visitor;



public partial class Visitor : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Pattern.Visitor.Messages m = new Pattern.Visitor.Messages();



        m.Attach(new SqlMessage(new MessageModel("插入", DateTime.Now)));

        m.Attach(new XmlMessage(new MessageModel("插入", DateTime.Now)));



        Response.Write(m.Accept(new InsertVisitor()));

        Response.Write(m.Accept(new GetVisitor()));

    }

}

运行结果

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)的更多相关文章

  1. 二十四种设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...

  2. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  3. 访问者模式(Visitor Pattern)——操作复杂对象结构

    模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...

  4. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

  5. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  6. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  7. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  8. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  9. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

随机推荐

  1. 【Cocos2d-X开发学习笔记】第01期:PC开发环境的详细搭建

    本文使用的是cocos2d-x-2.1.4版本 ,截至目前为止是最新稳定版 所谓的开发环境就是制作游戏的地方,打个比方读者就会十分清楚了.比如提到做饭,人们都会想到厨房.这是 因为厨房有炉灶.烟机.水 ...

  2. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  3. Graphviz 绘制流程图

    凝视说明非常具体.不再详述. digraph G{ //dot 是一种画图语言,它能够方便你採用图形的方式高速.直观地表达一些想法, //比方描写叙述某个问题的解决方式,构思一个程序的流程,澄清一堆貌 ...

  4. JavaScript(15)jQuery 选择器

    jQuery 选择器 选择器同意对元素组或单个元素进行操作. jQuery 元素选择器和属性选择器同意通过标签名.属性名或内容对 HTML 元素进行选择. 在 HTML DOM 术语中:选择器同意对 ...

  5. cocos2.2.3 HelloCpp TestCpp android 环境搭建 编译

    cygwin make PATH->E:\cygwin\bin JAVA_HOME->C:\Program Files\Java\jdk1.8.0_05 Eclipse->Windo ...

  6. POJ 2365 Rope(水题)

    [题意简述]:给出我们钉子个数与半径,让我们求出缠绕在钉子上的绳子有多长. [分析]:从题目中我们能够看出,绳子长度的和等于每两个钉子的距离的和加上接触在钉子上的绳子的长度,不难发现这部分长度事实上就 ...

  7. Xtext什么

    在Xtext官方网站是这么说的 "Building your own domain-specific languages has never been so easy. Just put y ...

  8. poj1947(树形dp)

    题目链接:http://poj.org/problem?id=1947 题意:给n(n<=150)个点的一棵树,求删掉最少边数k使得最后该树只剩下p(1<=p<=n)个节点.(求最小 ...

  9. JS类定义方式

    // 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : funct ...

  10. asp.net Login控件基本属性及事件说明

    原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径. Login系列控件包含下列控件: Login 登录控件 ...