访问者模式(Visitor Pattern)

六个角色:抽象访问者(Visitor)、具体访问者(ConcreteVisitor)、抽象元素(Element)、具体元素(ConcreteElement)、对象结构类(ObjectStructure)、客户端(Client) 

        抽象访问者(Visitor):抽象出访问元素的动作

        具体访问者(ConcreteVisitor):实现访问元素的动作

        抽象元素(Element):定义一个接受访问的操作,其参数为访问者

        具体元素(ConcreteElement):实现接受访问操作

        对象结构类(ObjectStructure):可以枚举元素,并且管理元素

        客户端(Client) :定义元素集合,然后接受不同访问者的访问

实现思路:向对象结构类中添加元素,然后定义多种访问者,使用对象结构类去接受访问者即可。

类图:

 

应用场景:用户去访问博客

分析:用户可以通过电脑上的Web方式(访问者)或者手机Wap方式(访问者)去访问博客,每篇博客是一个元素,然后博客列表是一个对象结构类。

        下面我们在控制台程序去演示一下如何使用Visitor Pattern:

        一、抽象访问者(Visitor):

    //抽象访问者(Visitor)
    abstract class Visitor
    {
        public abstract void VisitBlog(Element element);
    }

        二、具体访问者(ConcreteVisitor):

复制代码
    //具体访问者(ConcreteVisitor)
    class WebVisitor : Visitor
    {
        public override void VisitBlog(Element element)
        {
            Console.WriteLine("通过电脑web网站方式访问Blog:" + element.BlogName);
        }
    }
    //具体访问者(ConcreteVisitor)
    class WapVisitor : Visitor
    {
        public override void VisitBlog(Element element)
        {
            Console.WriteLine("通过手机wap网站方式访问Blog:" + element.BlogName);

        }  
    }
复制代码

        三、抽象元素(Element):

    //抽象元素(Element)
    abstract class Element
    {
        public string BlogName { get; set; }
        abstract public void Accept(Visitor visotr);
    }

        四、具体元素(ConcreteElement):

复制代码
    //具体元素(ConcreteElement)
    class BlogElement : Element
    {
        public BlogElement(string blogname)
        {
            this.BlogName = blogname;
        }
        public override void Accept(Visitor visitor)
        {
            visitor.VisitBlog(this);
        }
    }
复制代码

        五、对象结构类(ObjectStructure):

复制代码
    //对象结构类(ObjectStructure)
    class Blogs
    {
        private IList<Element> blogList = new List<Element>();

        public void AddBlog(Element element)
        {
            blogList.Add(element);
        }

        public void RemoveBlog(Element element)
        {
            blogList.Remove(element);
        }
        public void Accept(Visitor visitor)
        {
            foreach (Element e in blogList)
                e.Accept(visitor);
        }
    }
复制代码

        六、客户端(Client) :

复制代码
    //客户端(Client)
    class Program
    {
        static void Main(string[] args)
        {
            Blogs blogs = new Blogs();
            blogs.AddBlog(new BlogElement("这是第一篇博文"));
            blogs.AddBlog(new BlogElement("这是第二篇博文"));
            blogs.AddBlog(new BlogElement("这是第三篇博文"));
            blogs.AddBlog(new BlogElement("这是第四篇博文"));

            Visitor webVisit = new WebVisitor();
            Visitor wapVisit = new WapVisitor();

            blogs.Accept(webVisit);
            blogs.Accept(wapVisit);
            Console.ReadLine();
        }
    }
复制代码

        如需源码请点击 VisitorPattern.rar 下载。

原地址 http://www.cnblogs.com/chengxingliang/archive/2011/10/24/2214033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值