C#设计模式:访问者模式(Vistor Pattern)
一,访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。
二,代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _21.访问者模式 { /// <summary> /// 1 集合的访问和访问者模式Visitor Pattern /// 2 倾斜的可扩展性设计 /// 3 具体场景是——我遍历每个元素对象,然后调用每个元素对象的Introduce方法来打印该元素对象的信息, /// 4 GetBehavior是完成特定的行为 /// 5 GetBehaviorVisitor完成自定义的行为 /// </summary> class Program { /// <summary> /// 访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。 /// </summary> /// <param name="args"></param> static void Main(string[] args) { try { Console.WriteLine("访问者模式Visitor"); List<People> peopleList = new List<People>() { new USA() { Id=638, Name="ttt" }, new Chinese() { Id=123, Name="ccc" } }; ///固定行为的对象遍历 foreach (var people in peopleList) { Console.WriteLine("*************************"); people.Introduce(); people.GetBehavior(); } { ///特定行为的对象遍历 VisitorSayBehavior visitor = new VisitorSayBehavior(); foreach (var people in peopleList) { Console.WriteLine("*************************"); people.Introduce(); people.GetBehaviorVisitor(visitor); } } { ///特定行为的对象遍历 VisitorEatBehavior visitor = new VisitorEatBehavior(); foreach (var people in peopleList) { Console.WriteLine("*************************"); people.Introduce(); people.GetBehaviorVisitor(visitor); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } /// <summary> /// 抽象访问者 /// </summary> public interface IVisitor { void GetBehaviorChinese(Chinese peopleChinese); void GetBehaviorUSA(USA peopleUsa); } /// <summary> /// 行为的扩展 /// 访问者:完成说话的行为 /// </summary> public class VisitorSayBehavior : IVisitor { public void GetBehaviorChinese(Chinese peopleChinese) { Console.WriteLine("中国人,说中文!!!"); } public void GetBehaviorUSA(USA peopleUsa) { Console.WriteLine("美国人,说英文!!!"); } } /// <summary> /// 行为的扩展 /// 访问者:完成吃饭的行为 /// </summary> public class VisitorEatBehavior : IVisitor { public void GetBehaviorChinese(Chinese peopleChinese) { Console.WriteLine("中国人,吃大米饭!!!"); } public void GetBehaviorUSA(USA peopleUsa) { Console.WriteLine("美国人,吃汉堡!!!"); } } /// <summary> /// 抽象元素角色 /// </summary> public abstract class People { public int Id { get; set; } public string Name { get; set; } public void Introduce() { Console.WriteLine("我是{0}!!", this.Name); } public abstract void GetBehavior(); public abstract void GetBehaviorVisitor(IVisitor visitor); } public class Chinese : People { /// <summary> /// 不同的人有不同的行为属性 /// </summary> public override void GetBehavior() { ////如果没有使用重载这里可能会使用过多if else //if() //{} //else if() //{} //else{} Console.WriteLine("中国人,使用筷子"); } //再建立多个方法 每个方法对应一种方式 //再建立一堆的子类 分别去完成 public override void GetBehaviorVisitor(IVisitor visitor) { visitor.GetBehaviorChinese(this);//this 是当前的实例 } } public class USA : People { public string CourseFree { get; set; } public string CourseVip { get; set; } public override void GetBehavior() { //if() //{} //else if() //{} //else{} Console.WriteLine("美国人,使用刀叉"); } public override void GetBehaviorVisitor(IVisitor visitor) { visitor.GetBehaviorUSA(this);//this 是当前的实例 } } }
三,以上代码完成了结构之上的操作,并且完成数据的自定义方式的扩展