【设计模式】20.访问者模式

说明:比如一开始有3个是执行Print方法,后来改需求了,要加多个时间显示,就需要3个都修改,加上访问者,客户端是由访问者去执行这3个类的方法。客户端无需改变代码。

实现:

public abstract class ABS_Element
    {
        public abstract void Accept(IVistor v);
        public abstract void Print();
    }

    public class ElementA : ABS_Element
    {
        public override void Accept(IVistor v)
        {
            //调用访问者
        }
        public override void Print()
        {
            //由访问者类来执行的方法
        }
    }

    public class ElementB : ABS_Element
    {
        public override void Accept(IVistor v)
        {
            //调用访问者
        }
        public override void Print()
        {
            //由访问者执行的方法
        }
    }

    public interface IVistor
    {
        //几个访问者类,加几个。
        void View(ElementA a);
        void View(ElementB b);
    }

    /// <summary>
    /// 访问者类
    /// </summary>
    public class Vistor : IVistor
    {
        public void View(ElementA a) {
            a.Print();
        }

        public void View(ElementB b) {
            b.Print();
        }
    }

    /// <summary>
    /// 我的
    /// </summary>
    public class MyList
    {
        private ArrayList eleList = new ArrayList();

        public ArrayList lists { get { return eleList; } }

        public void action()
        {
            foreach(ABS_Element e in eleList)
            {
                e.Accept(new Vistor());
            }
        }
    }

    public class test
    {
        public void start()
        {
            //将节点添加进集合
            MyList obj1 = new MyList();
            obj1.lists.Add(new ElementA());
            obj1.lists.Add(new ElementA());
            obj1.lists.Add(new ElementB());

            //开始访问
            obj1.action();

        }
    }
原文地址:https://www.cnblogs.com/laokchen/p/13544129.html