zoukankan      html  css  js  c++  java
  • 访问者模式

    访问者模式:表示一个作用于某对象结构中的各元素的操作,他使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

    举例说明,假设家庭中通常有丈夫和妻子两个人,两人对不同的访客有不同大反应

    首先定义不同的访客:

        /// <summary>
        /// 访问者接口
        /// </summary>
        public abstract class Visitor
        {
            public abstract void GetWifeAction(Wife wife);
            public abstract void GetHusbandAction(Husband husband);
        }
    
        /// <summary>
        /// 具体的访问者,内部定义针对不同数据的不同行为
        /// </summary>
        public class PuoPuo : Visitor
        {
            public override void GetWifeAction(Wife wife)
            {
                Console.WriteLine("婆婆来了,妻子{0}不高兴",wife.Name);
            }
    
            public override void GetHusbandAction(Husband husband)
            {
                Console.WriteLine("妈妈来了,丈夫{0}高兴", husband.Name);
            }
        }
    
        public class MumMum : Visitor
        {
    
            public override void GetWifeAction(Wife wife)
            {
                Console.WriteLine("妈妈来了,妻子{0}高兴", wife.Name);
            }
    
            public override void GetHusbandAction(Husband husband)
            {
                Console.WriteLine("丈母娘来了,丈夫{0}高兴", husband.Name);
            }
        }
    

    下面定义数据结构接口和具体数据结构

        /// <summary>
        /// 数据结构接口
        /// </summary>
        public abstract class Element
        {
            public abstract void Accept(Visitor visitor);
        }
    
        /// <summary>
        /// 具体的一个数据结构
        /// </summary>
        public class Wife : Element
        {
            public string Name { get; set; }
            public override void Accept(Visitor visitor)
            {
                visitor.GetWifeAction(this);
            }
        }
    
        public class Husband : Element
        {
            public string Name { get; set; }
            public override void Accept(Visitor visitor)
            {
                visitor.GetHusbandAction(this);
            }
        }  

     下面定一个数据结构的管理类,例如一个家庭类:

        /// <summary>
        /// 数据结构管理类
        /// </summary>
        public class ObjectStructure
        {
            private List<Element> familyMembers = new List<Element>();
    
            public void Add(Element newMember)
            {
                familyMembers.Add(newMember);
            }
    
            public void Remove(Element oldMember)
            {
                familyMembers.Remove(oldMember);
            }
    
            public void GetAction(Visitor visitor)
            {
                foreach (var member in familyMembers)
                {
                    member.Accept(visitor);
                }
            }
        }
    

    客户端调用代码如下:

               Wife wife = new Wife() { Name = "小杨" };
                Husband husband = new Husband() { Name = "小朱" };
    
                ObjectStructure family = new ObjectStructure();
                family.Add(wife);
                family.Add(husband);
    
                PuoPuo puopuo = new PuoPuo();
                family.GetAction(puopuo);
    
                MumMum mummum = new MumMum();
                family.GetAction(mummum);
    

    执行结果如下:

    婆婆来了,妻子小杨不高兴
    妈妈来了,丈夫小朱高兴
    妈妈来了,妻子小杨高兴
    丈母娘来了,丈夫小朱高兴

    访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可以相对自由的演化,因此,如果系统有比较稳定的数据结构,又有易于变化的算法,那么访问者模式就是比较适合的。
    优点:新增操作容易,新增操作就是新增访问者,并将有关行为集中到一个访问对象中,例如增加一个新的访问者,如朋友,只需增加一个具体访问者类即可
    缺点:新增数据结构困难,通常数据结构是固定的,否则增加一个数据结构,所有的访问者对象全部要修改,例如如果要增加家庭成员,如孩子,则所有的访问者类都需要修改

     

      

     

  • 相关阅读:
    C/C++ 编程中的内存屏障(Memory Barriers) (1)
    ubuntu 10.04 源
    内存屏障(经典)
    VMware设置桥接上网
    C/C++ 编程中的内存屏障(Memory Barriers) (2)
    寒假Day55:指针
    寒假Day54:poj2378Tree Cutting没用树形dp写的树的题dfs
    寒假Day50:CodeForces1324CFrog Jumps思维
    寒假Day50:51nod3047位移运算
    寒假Day53:Codeforces519B水题
  • 原文地址:https://www.cnblogs.com/angela217/p/5489164.html
Copyright © 2011-2022 走看看