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

    定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

    类图:

    •  抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
    • 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
    • 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
    • 元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
    • 结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色

    代码:

        public abstract class Visitor
        {
            public abstract void VisitorOneElement(OneElement one);
            public abstract void VisitorTwoElement(TwoElement Two);
        }
    
        public class ConcreteOneVisitor : Visitor
        {
            public override void VisitorOneElement(OneElement one)
            {
                Console.WriteLine("{0} visited by {1}", one, this);
            }
    
            public override void VisitorTwoElement(TwoElement Two)
            {
                Console.WriteLine("{0} visited by {1}", Two, this);
            }
        }
        public class ConcreteTwoVisitor : Visitor
        {
            public override void VisitorOneElement(OneElement one)
            {
                Console.WriteLine("{0} visited by {1}", one, this);
            }
    
            public override void VisitorTwoElement(TwoElement Two)
            {
                Console.WriteLine("{0} visited by {1}", Two, this);
            }
        }
    
    
    
        public abstract class Element
        {
            public abstract void Accept(Visitor visitor);
        }
    
        public class OneElement : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitorOneElement(this);
            }
        }
        public class TwoElement : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitorTwoElement(this);
            }
        }
    
        //通过该类ObjectStruct把Element和visitor串联
    
        public class ObjectStruct
        {
            private IList<Element> list = new List<Element>();
    
            public void Attach(Element element)
            {
                list.Add(element);
            }
            public void Detach(Element element)
            {
                list.Remove(element);
            }
            //展示
            public void ObjectAccept(Visitor visitor)
            {
                foreach (Element e in list)
                {
                    e.Accept(visitor);
                }
            }
        }

    调用:

                ObjectStruct os = new ObjectStruct();
                os.Attach(new OneElement());
                os.Attach(new TwoElement());
    
                ConcreteOneVisitor one = new ConcreteOneVisitor();
                ConcreteTwoVisitor two = new ConcreteTwoVisitor();
                os.ObjectAccept(one);
                os.ObjectAccept(two);

    结果:

  • 相关阅读:
    luogu P1877 [HAOI2012]音量调节
    luogu P1510 精卫填海
    luogu P1508 Likecloud-吃、吃、吃
    我的VIM
    luogu P1310 表达式的值
    luogu P1402 酒店之王
    luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
    luogu P1879 [USACO06NOV]玉米田Corn Fields
    luogu P2746 [USACO5.3]校园网Network of Schools
    [BZOJ4870][六省联考2017]组合数问题(组合数动规)
  • 原文地址:https://www.cnblogs.com/nygfcn1234/p/3410494.html
Copyright © 2011-2022 走看看