设计模式:访问者模式(Visitor)

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

结构图:

设计模式:访问者模式(Visitor)_第1张图片

 

示例:

设计模式:访问者模式(Visitor)_第2张图片

状态类:

 //状态的抽象类
    abstract class Action
    {
        public abstract void GetManConclusion(Man concreteElementA);  //得到男人的结论或反应

        public abstract void GetWomanConclusion(Woman concreteElementB); //得到女人的结论或反应
    }

    //成功 状态
    class Success : Action
    {
        public override void GetManConclusion(Man concreteElementA)
        {
            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 Failing : Action
    {
        public override void GetManConclusion(Man concreteElementA)
        {
            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);
        }
    }
View Code

人,男人,女人:

  //"人"的抽象类
    abstract class Person1
    {
        public abstract void Accept(Action visitor); //接受,用来获得状态对象
    }

    //男人
    class Man : Person1
    {
        public override void Accept(Action visitor)
        {
            visitor.GetManConclusion(this);
        }
    }

    //女人
    class Woman : Person1
    {
        public override void Accept(Action visitor)
        {
            visitor.GetWomanConclusion(this);
        }
    }
View Code

对象结构类:

//对象结构
    class ObjectStructure
    {
        public IList<Person1> persons = new List<Person1>();

        //增加
        public void Attach(Person1 person)
        {
            persons.Add(person);
        }

        //移除
        public void Detach(Person1 person)
        {
            persons.Remove(person);
        }

        //查看显示
        public void Display(Action visitor)
        {
            foreach (Person1 person in persons)
            {
                person.Accept(visitor);
            }
        }
    }
View Code

客户端调用:

            ObjectStructure o = new ObjectStructure();
            //对象结构中加入要对比的“男人”和“女人”
            o.Attach(new Man());
            o.Attach(new Woman());

            //成功时的反应
            Success v1 = new Success();
            o.Display(v1);

            //失败时的时的反应
            Failing v2 = new Failing();
            o.Display(v2);

            //结婚时的反应
            //Marry v3 = new Marry();
            //o.Display(v3);
View Code

结果:

你可能感兴趣的:(visitor)