访问者模式

来源:互联网 发布:淘宝达人怎么修改资料 编辑:程序博客网 时间:2024/06/07 00:42


//访问者模式
模式定义:
 访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    首先我们要明确一点就是访问者模式适用于数据结构相对稳定的系统。它是将数据的操作与数据结构进行分离了,如果某个系统的数据结构相对稳定,但是操作算法易于变化的话,就比较适用适用访问者模式,因为访问者模式使得算法操作的增加变得比较简单了。
 
 
 
  优点

          1、使得新增新的访问操作变得更加简单。

          2、能够使得用户在不修改现有类的层次结构下,定义该类层次结构的操作。

          3、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。

        缺点

          1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。
           2、破坏封装。当采用访问者模式的时候,就会打破组合类的封装。

          3、比较难理解。貌似是最难的设计模式了。
试用场景:
   1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

   2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

(推荐文章:http://blog.csdn.net/chenssy/article/details/12029633)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace yjzcjing
{
    abstract class Action//访问者模式中的访问者
    {
        public abstract void GetManConclusion(Man concreteElementA);//获得man的状态
        public abstract void GetWomanConclusion(Woman concreteElementB);//获得woman的状态
    }
    abstract class Persion//定义一个accept操作,它以一个访问者为参数。
    {
        public abstract void Accept(Action visitor);
    }
    class Success:Action//具体访问者
    {
        public override void GetManConclusion(Man concreteElementA)//访问Man的对象
        {
            Console.WriteLine("{0}{1}时,背后多半有一个伟大的女人!", concreteElementA.GetType().Name, this.GetType().Name);
        }
        public override void GetWomanConclusion(Woman concreteElementB)
        {
            Console.WriteLine("{0}{1}时,背后多半有一个不成功的男人!", concreteElementB.GetType().Name, this.GetType().Name);
        }
    }
    class Man:Persion//具体元素,实现accept操作
    {
        public override void Accept(Action visitor)
        {
            visitor.GetManConclusion(this);
        }
    }
    class Woman:Persion
    {
        public override void Accept(Action visitor)
        {
            visitor.GetWomanConclusion(this);
        }
    }
    class objectstructure//枚举元素
    {
        private IList<Persion> elements = new List<Persion>();
        public void Attach(Persion element)//添加对象
        {
            elements.Add(element);
        }
        public void Detach(Persion element)
        {
            elements.Remove(element);
        }
        public void Display(Action visitor)//枚举
        {
            foreach(Persion e in elements)
            {
                e.Accept(visitor);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            objectstructure o = new objectstructure();
            o.Attach(new Man());
            o.Attach(new Woman());
            Success v1 = new Success();
            o.Display(v1);
            Console.Read();
        }
    }
}
//操作元素与访问者相互关联,操作者以访问者为参数,



0 0
原创粉丝点击