原文:乐在其中设计模式(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. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

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

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

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

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

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

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

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

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

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

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

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

  9. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

随机推荐

  1. fir.im Weekly - 聊聊 Google 开发者大会

    中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国.12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Develope ...

  2. Canvas 属性,方法

      context . restore() //弹出堆最上面保存的绘图状态 context . save() //在绘图状态堆上保存当前绘图状态 绘图状态可以看作当前画面应用的所有样式和变形的一个快照 ...

  3. Log4net使用指南

    请在这里下载示例代码 1           简介 1.1          Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的 ...

  4. CentOS7 安装Docker报错

    安装报错: Transaction check error:  file /usr/lib/systemd/system/blk-availability.service from install o ...

  5. Tomcat代码执行漏洞(CVE-2017-12615)的演绎及个人bypass

    0x00 漏洞简介 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞. 漏洞CVE编号:CVE-2017-12615和CVE-2017-12616. 其中 远程代码执行漏洞 ...

  6. hdu_1025(LIS Nlog(N)算法)

    题意:自己慢慢读吧.大概就是道路两边建路,给出建路需求,要求两条路不能有交叉,问最多可以建多少条路. 题解:一看数据范围500000,应该是dp,再画个图模拟一下,发现实质就是求最长上升子序列,很自然 ...

  7. 蚂蚁爬杆问题 UVA 10881

    算法入门经典训练指南上的题. 这里有必要讲一下蚂蚁爬杆问题:每只蚂蚁都有一个初始方向,相撞会转向,关键就是相撞的处理,由于速度并不会改变,两只蚂蚁相撞,可以看做,两只蚂蚁穿过对方,继续沿原方向前进,经 ...

  8. day1——分割数组

    // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第915题 今日算法题干//给定一个数组 A,将其划分为两个不相交(没有公共元素) ...

  9. [转]python中的正则表达式(re模块)

    转自:https://www.cnblogs.com/tina-python/p/5508402.html 一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成 ...

  10. RS232、RS485和RS422

    一.232电平.TTL电平和CMOS电平        1.232电平:逻辑1:-3V--15V: 逻辑0:+3-+15V. 2.TTL电平:逻辑1:5V: 逻辑0:0V.具体是,输出高电平:VOH≥ ...