当前位置:编程学习 > C#/ASP.NET >>

设计模式之--访问者模式

 

《设计模式》一书对于访问者模式给出的定义为:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。从定义可以看出结构对象是使用访问者模式必须条件,而且这个结构对象必须存在遍历自身各个对象的方法。

 

设想一个场景,就是学校,学校里有老师和学生,老师和学生可以称为两种元素,我们可以对这些元素进行很多操作(注意,这些操作都是外部性质的,不属于元素本身,这个至关重要),比如评价,问卷调查,采访和体检等,如果我们把这些操作定义在元素层次,显然不合理,一是这些操作不是元素对象的固有属性和行为,而是一些外部操作,不符合面向对象的封装和责任单一原则。如果把这些操作定义在学校这层,显然也不合理,因为学校的责任只是对老师和学生进行管理,这些操作也不是学校的职责。既然不能定义在元素层和学校层,我们可以单独定义一个层次结构来实现,但这里面有两个问题,一是这些操作可能对不同的元素有不同的形式,二是这些操作还必须得到元素的许可,即元素可以接收你的访问。上面的场景其实就是访问者模式的典型应用场景,下面访问者的简图:

\

 

上面场景的实现代码:

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DesignModelStudy

{

    public abstract class Person

    {

        public abstract void Accept(Person_Visitor VA);

        public abstract int GetPersonType();

    }

 

    //Studeng对象.

    class Student : Person

    {

        private int _id;

        private string _name;

        public override int GetPersonType()

        {

            return 1;

        }

        public Student(int ID, string Name)

        {

            this._name = Name;

            this._id = ID;

        }

        public int ID

        {

            get

            {

                return this._id;

            }

            set

            {

                this._id = value;

            }

        }

        public string Name

        {

            get

            {

                return this._name;

            }

            set

            {

                this._name = value;

            }

        }

        public override void Accept(Person_Visitor VA)

        {

            System.Windows.Forms.MessageBox.Show(VA.Visit(this));

        }

    }

    //Teacher对象.

    class Teacher : Person

    {

        private int _id;

        private string _name;

        private int _age;

        public Teacher(int ID, string Name,int Age)

        {

            this._name = Name;

            this._id = ID;

            this._age = Age;

        }

        public int ID

        {

            get

            {

                return this._id;

            }

            set

            {

                this._id = value;

            }

        }

        public string Name

        {

            get

            {

                return this._name;

            }

            set

            {

                this._name = value;

            }

        }

        public int Age

        {

            get

            {

                return this._age;

            }

            set

            {

             

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,