一,訪問者模式是用來封裝一些施加於某種數據結構之上的操做。它使得能夠在不改變元素自己的前提下增長做用於這些元素的新操做,訪問者模式的目的是把操做從數據結構中分離出來。數據結構
二,代碼ide
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 是當前的實例 } } }
三,以上代碼完成告終構之上的操做,而且完成數據的自定義方式的擴展this