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

    访问者(Visitor)模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。


    /*
    * 抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口。
    * 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作。
    * 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象作为一个参量。
    * 具体节点(Node)角色:实现了抽象元素所规定的接受操作。
    * 结构对象(ObiectStructure)角色:有如下的一些责任,可以遍历结构中的所有元素;
        如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;
        如果需要,可以设计成一个复合对象或者一个聚集,如列(List)或集合(Set)。
    */

                   Console.WriteLine("//===============//");
    
                ObjectStructures o2 = new ObjectStructures();
                o2.Attach(new Man());
                o2.Attach(new Woman());
    
                Success s = new Success();
                o2.Accept(s);
    
                //失败时候....
    
    
    
        /// <summary>
        /// 状态抽象类  抽象访问者(Visitor)
        /// </summary>
        public abstract class Action
        {
            //得到男人结论
            public abstract void GetManConclusion(Man man);
    
            //得到女人结论
            public abstract void GetWomanConclusion(Woman woman);
        }
    
        /// <summary>
        /// 人抽象类 抽象节点(Node)
        /// </summary>
        public abstract class Person
        {
            //接受
            public abstract void Accept(Action action);
        }
    
        /// <summary>
        /// 具体访问者 
        /// </summary>
        public class Success : Action
        {
            public override void GetManConclusion(Man man)
            {
                Console.WriteLine("{0} {1} 时,背后多半有一个伟大的女人。", man.GetType().Name,this.GetType().Name);
            }
    
            public override void GetWomanConclusion(Woman woman)
            {
                Console.WriteLine("{0} {1} 时,背后多半有一个不成功的男人。", woman.GetType().Name, this.GetType().Name);
            }
        }
    
        public class Man : Person
        {
    
            public override void Accept(Action action)
            {
                action.GetManConclusion(this);
            }
        }
    
        public class Woman : Person
        { 
            public override void Accept(Action action)
            {
                action.GetWomanConclusion(this);
            }
        }
    
    
        //结构对象(ObiectStructure)角色
        public class ObjectStructures
        { 
            private ArrayList elements = new ArrayList();
            public void Attach(Person element)
            {
                elements.Add(element);
            }
    
            public void Detach(Person element)
            {
                elements.Remove(element);
            }
    
            public void Accept(Action visitor)
            {
                foreach (Person e in elements)
                    e.Accept(visitor);
            }
        }
  • 相关阅读:
    C# 监测每个方法的执行次数和占用时间(测试1)
    C# 依赖注入那些事儿
    SQL Server GROUP BY 后 拼接 字符串
    C# 根据Excel生成树
    C# 反射赋值
    C# 集合转换为DataTable
    Oracle 未能加载文件或程序集Oracle.DataAccess
    MySQL 各种主流 SQLServer 迁移到 MySQL 工具对比
    平衡树
    数据结构优化dp
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3792849.html
Copyright © 2011-2022 走看看