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);

    结果:

  • 相关阅读:
    Go语言 函数return值的几种情况
    VSCode 常用快捷键 Mac
    Java异常处理
    Java面向对象《三》
    C++类模板
    C++函数模板
    盛最多水的容器
    实现 Trie (前缀树)
    排序链表
    类似某团app搜索城市界面中 点击右侧城市首字母,对应城市区域置顶的功能(uniapp)
  • 原文地址:https://www.cnblogs.com/nygfcn1234/p/3410494.html
Copyright © 2011-2022 走看看