• 访问者(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);
            }
        }
  • 相关阅读:
    asp.net 文件下载
    net 数据库连接详解 相当经典啊
    取值:webconfig中的key
    通过监听的端口查找本机进程和服务思路
    以系统服务运行某个程序
    测底根除Windows流氓软件开机自动运行
    使用Wireshark在主机上抓取远程主机的数据流量
    记录Windows远程登录日志
    证书不匹配发出告警的解决方法
    WPS office云同步图标彻底删除方法
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3792849.html
Copyright © 2020-2023  润新知