zoukankan      html  css  js  c++  java
  • Net设计模式实例之访问者模式(Visitor Pattern)

    一、访问者模式简介(Brief Introduction

    表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。

    二、解决的问题(What To Solve

           访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。

    三、访问者模式分析(Analysis

    1、访问者模式结构

    Visitor:为对象结构中Element的每一个子类声明一个Visitor操作。

    ConcreteVisitor1ConcreteVisitor2:具体的访问者,实现父类Visitor的操作。每个操作实现算法的一部分,而该算法片段仍是对应与结构中对象的类。

    ObjectStructure:枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。

    Element:定义一个Accept操作,它以一个访问者为参数。

    ConcreteElementAConcreteElementB: 具体元素,实现父类Element的方法Accept

    2、源代码

    1、访问者抽象类Visitor

    public abstract class Visitor

    {

        public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

     

        public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);

    }

     

    2、具体访问者ConcreteVisitor1ConcreteVisitor2

    public class ConcreteVisitor1 : Visitor

    {

     

        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)

        {

            Console.WriteLine("{0}访问{1}",this.GetType().Name,concreteElementA.GetType().Name);

        }

     

        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)

        {

            Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name);

        }

    }

     

    public class ConcreteVisitor2 : Visitor

    {

     

        public override void VisitConcreteElementA(ConcreteElementA concreteElementA)

        {

            Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementA.GetType().Name);

        }

     

        public override void VisitConcreteElementB(ConcreteElementB concreteElementB)

        {

            Console.WriteLine("{0}访问{1}", this.GetType().Name, concreteElementB.GetType().Name);

        }

     

    3、定义一个Accept操作,它以一个访问者为参数

    public abstract class Element

    {

        public abstract void Accept(Visitor visitor);

    }

     

    4、具体元素ConcreteElementAConcreteElementB

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

        {

     

        }

    }

     

    5、对象结构ObjectStructure

    public class ObjectStructure

    {

        IList<Element> elements=new List<Element>();

     

        public void Add(Element e)

        {

            elements.Add(e);

        }

     

        public void Remove(Element e)

        {

            elements.Remove(e);

        }

     

        public void Accept(Visitor visitor)

        {

            foreach (Element e in elements)

            {

                e.Accept(visitor);

            }

        }

    }

     

    5、客户端代码

    static void Main(string[] args)

    {

        ObjectStructure os = new ObjectStructure();

        os.Add(new ConcreteElementA());

        os.Add(new ConcreteElementB());

     

        ConcreteVisitor1 cv1 = new ConcreteVisitor1();

        ConcreteVisitor2 cv2 = new ConcreteVisitor2();

        os.Accept(cv1);

        os.Accept(cv2);

     

        Console.Read();

    }

    3、程序运行结果

    四、总结(Summary

    访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来

  • 相关阅读:
    windows下 python2 和python3 共存
    利用xshell远程连接centos安装oracle11g时在图形界面登录
    本地导入/导出远程oracle数据库
    centos7安装桌面环境
    普通用户修改.bash_profile 权限问题
    centos7 安装oracle11g
    Unable to fetch some archives ,maybe run apt-get update or try with --fix-missing?
    spring mvc 使用ehcache
    leaflet创建简单地图
    【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)
  • 原文地址:https://www.cnblogs.com/zhuawang/p/2192702.html
Copyright © 2011-2022 走看看