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

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

    namespace VisitorDesign
    {
        public abstract class Visitor
        {
            public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
            public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
        }
        public class ConcreteVisitor1 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);
            }
    
            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
            }
        }
        public class ConcreteVisitor2 : Visitor
        {
            public override void VisitConcreteElementA(ConcreteElementA concreteElementA)
            {
                Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name);
            }
    
            public override void VisitConcreteElementB(ConcreteElementB concreteElementB)
            {
                Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name);
            }
        }
        public abstract class Element
        {
            public abstract void Accept(Visitor visitor);
        }
        public class ConcreteElementA : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementA(this);
            }
            public void OperationA()
            {
    
            }
        }
        public class ConcreteElementB : Element
        {
            public override void Accept(Visitor visitor)
            {
                visitor.VisitConcreteElementB(this);
            }
            public void OperationB()
            {
    
            }
        }
        public class ObjectStructure
        {
            private IList<Element> elements = new List<Element>();
            public void Attach(Element element)
            {
                elements.Add(element);
            }
            public void Detach(Element element)
            {
                elements.Remove(element);
            }
            public void Accept(Visitor visitor)
            {
                foreach(Element e in elements)
                {
                    e.Accept(visitor);
                }
            }
        }
    }
    View Code

    测试代码:

                ObjectStructure o = new ObjectStructure();
                o.Attach(new ConcreteElementA());
                o.Attach(new ConcreteElementB());
                ConcreteVisitor1 v1 = new ConcreteVisitor1();
                ConcreteVisitor2 v2 = new ConcreteVisitor2();
                o.Accept(v1);
                o.Accept(v2);
    View Code
  • 相关阅读:
    奇技淫巧训练之一
    基于JS模块化现状谈谈选择ES6模块的原因
    vue-cli3项目搭建配置以及性能优化
    Umi + DvaJS
    ReactFragment用法介绍
    什么是纯函数
    10.25考试
    10.23考试
    线段树合并(雨天的尾巴 题解)
    10.21考试
  • 原文地址:https://www.cnblogs.com/uptothesky/p/5287360.html
Copyright © 2011-2022 走看看