访问者模式是封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
就是对数据结构的操作独立出来,变成可扩展性的。如果数据结构有变化那将是全部都要改,非常恐怖。
代码:
数据结构: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();
运行结果: