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
  • 相关阅读:
    react给input元素中文输入的时候自动转成字符串bug
    charles代理
    es6和es5函数参数和arguments的差别
    Uncaught InvalidStateError: Failed to set the 'value' property on 'HTMLInputElement': This input element accepts a filename, which may only be programmatically set to the empty string.
    Node 开发概述
    对Flutter路由管理库Fluro的封装
    Flutter 切换标签显示对应的列表+Provide状态管理实例
    Flutter 商城实例 分类列表
    Flutter 入口页面及底部导航栏实例制作
    Flutter 建立项目和编写入口文件
  • 原文地址:https://www.cnblogs.com/uptothesky/p/5287360.html
Copyright © 2011-2022 走看看