访问者模式

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

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

代码:

数据结构: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();

运行结果:

 

 

转载于:https://www.cnblogs.com/lystory/p/5706499.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值