访问者模式是封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

就是对数据结构的操作独立出来,变成可扩展性的。如果数据结构有变化那将是全部都要改,非常恐怖。

代码:

数据结构:Student,操作就是 Reading

    public class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public virtual void Reading(IVisitor visitor)
        { }
    }

访问动作:IVisitor

    public interface IVisitor
    {
        void Primary();
        void Middle();
        void High();
        void University();
    }

学生集合:继承 Student 基类

    public class PrimaryStudent : Student
    {
        public override void Reading(IVisitor visitor)
        {
            visitor.Primary();
        }
    }
    public class MiddleStudent : Student
    {
        public override void Reading(IVisitor visitor)
        {
            visitor.Middle();
        }
    }
    public class HighStudent : Student
    {
        public override void Reading(IVisitor visitor)
        {
            visitor.High();
        }
    }
    public class UniversityStudent : Student
    {
        public override void Reading(IVisitor visitor)
        {
            visitor.University();
        }
    }

学校集合:继承 IVisitor

    public class PrimarySchool : IVisitor
    {
        public void High()
        {
            Console.WriteLine("拒绝");
        }

        public void Middle()
        {
            Console.WriteLine("拒绝");
        }

        public void Primary()
        {
            Console.WriteLine("小学生可以进入");
        }

        public void University()
        {
            Console.WriteLine("拒绝");
        }
    }
    public class MiddleSchool : IVisitor
    {
        public void High()
        {
            Console.WriteLine("拒绝");
        }

        public void Middle()
        {
            Console.WriteLine("中学生可以进入");
        }

        public void Primary()
        {
            Console.WriteLine("拒绝");
        }

        public void University()
        {
            Console.WriteLine("拒绝");
        }
    }
    public class HighSchool : IVisitor
    {
        public void High()
        {
            Console.WriteLine("高中学生可以进入");
        }

        public void Middle()
        {
            Console.WriteLine("拒绝");
        }

        public void Primary()
        {
            Console.WriteLine("拒绝");
        }

        public void University()
        {
            Console.WriteLine("拒绝");
        }
    }
    public class UniversityCollege : IVisitor
    {
        public void High()
        {
            Console.WriteLine("拒绝");
        }

        public void Middle()
        {
            Console.WriteLine("拒绝");
        }

        public void Primary()
        {
            Console.WriteLine("拒绝");
        }

        public void University()
        {
            Console.WriteLine("大学生可以进入");
        }
    }

 

使用:

            List<Student> StudentList = new List<Student>() {
                new HighStudent() {  Age=15, Name="张小明"},
                 new MiddleStudent() {  Age=12, Name="王云"},
                 new UniversityStudent() {  Age=22, Name="赵鹏"},
                 new PrimaryStudent() {  Age=7, Name="宗佳美"},
                 new PrimaryStudent() {  Age=7, Name="尚丽娜"},
                 new MiddleStudent() {  Age=13, Name="钱云慧"},
                  new HighStudent() {  Age=15, Name="刘丽君"}

            };


            StudentList.ForEach(s =>
            {
                Console.WriteLine("{0},{1}", s.Name, s.Age);
                s.Reading(new HighSchool());
            });

            StudentList.ForEach(s =>
            {
                Console.WriteLine("{0},{1}", s.Name, s.Age);
                s.Reading(new PrimarySchool());
            });
            StudentList.ForEach(s =>
            {
                Console.WriteLine("{0},{1}", s.Name, s.Age);
                s.Reading(new MiddleSchool());
            });
            StudentList.ForEach(s =>
            {
                Console.WriteLine("{0},{1}", s.Name, s.Age);
                s.Reading(new UniversityCollege());
            });

            Console.ReadLine();

运行结果:

 

 

posted on 2016-07-26 10:29  梦回过去  阅读(204)  评论(0编辑  收藏  举报