日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

              歡迎訪問 生活随笔!

              生活随笔

              當前位置: 首頁 > 编程语言 > asp.net >内容正文

              asp.net

              设计模式笔记(24)---访问者模式(行为型)

              發布時間:2023/12/10 asp.net 33 豆豆
              生活随笔 收集整理的這篇文章主要介紹了 设计模式笔记(24)---访问者模式(行为型) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

              Gof定義

              表示一個作用于某對象結構中的各元素的操作。它可以在不改變各元素的類的前提下定義作用于這些元素的新的操作。

              動機

              在軟件構建過程中,由于需求的改變,某些類層次結構中常常需要增加新的行為(方法),如果直接在基類中做這樣的更改,將會給子類帶來很繁重的變更負擔,甚至破壞原有設計。如何在不更改類層次結構的前提下,在運行時根據需要透明地為類層次結構上的各個類動態添加新的操作,從而避免上述問題?請看下面訪問者模式結構圖和代碼。

              訪問者模式結構圖:

              基本代碼如下:

              /// <summary> /// 聲明了一個或多個需要添加的操作 /// </summary> public abstract class Visitor {public abstract void VisitorConcreteElementA(ConcreteElementA concreteElementA);public abstract void VisitorConcreteElementB(ConcreteElementB concreteElementB); } /// <summary> /// 操作的具體類1 /// </summary> public class ConcreteVisitor1:Visitor {public override void VisitorConcreteElementA(ConcreteElementA concreteElementA){Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementA.GetType().Name);}public override void VisitorConcreteElementB(ConcreteElementB concreteElementB){Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementB.GetType().Name);} } /// <summary> /// 操作的具體類2 /// </summary> public class ConcreteVisitor2 : Visitor {public override void VisitorConcreteElementA(ConcreteElementA concreteElementA){Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementA.GetType().Name);}public override void VisitorConcreteElementB(ConcreteElementB concreteElementB){Console.WriteLine("{0}訪問{1}", this.GetType().Name, concreteElementB.GetType().Name);} } /// <summary> /// 接受Visitor并使用其操作的抽象類 /// </summary> public abstract class Element {public abstract void Accept(Visitor visitor); } /// <summary> /// 接受Visitor并使用其操作的具體類 /// </summary> public class ConcreteElementA : Element {public override void Accept(Visitor visitor){visitor.VisitorConcreteElementA(this);}public void OperationA() { } } /// <summary> /// 接受Visitor并使用其操作的具體類 /// </summary> public class ConcreteElementB : Element {public override void Accept(Visitor visitor){visitor.VisitorConcreteElementB(this);}public void OperationB() { } } public class ObjectStructure {private List<Element> list = new List<Element>();public void Add(Element element){list.Add(element);}public void Del(Element element){if(list.Contains(element))list.Remove(element);}public void Accept(Visitor visitor){foreach (Element e in list){e.Accept(visitor);}} } /// <summary> /// 客戶端代碼 /// </summary> class Program {static void Main(string[] args){ObjectStructure os = new ObjectStructure();os.Add(new ConcreteElementA());os.Add(new ConcreteElementB());Visitor cv1 = new ConcreteVisitor1();Visitor cv2 = new ConcreteVisitor2();os.Accept(cv2);os.Accept(cv1);} }

              Visitor模式的幾個要點

              • Visitor模式通過所謂雙重分發(double dispatch)來實現在不更改Element類層次結構的前提下,在運行時透明地為類層次結構上的各個類動態添加新的操作。
              • Visitor模式通過所謂雙重分發(double dispatch)來實現在不更改Element類層次結構的前提下,在運行時透明地為類層次結構上的各個類動態添加新的操作。
              • Visitor模式的最大缺點在于擴展類層次結構(增添新的Element子類),會導致Visitor類的改變。因此Vistor模式適用于“Element類層次結構穩定,而其中的操作卻經常面臨頻繁改動”。

              ?

              返回開篇(索引)

              轉載于:https://www.cnblogs.com/oec2003/archive/2010/02/02/1662265.html

              總結

              以上是生活随笔為你收集整理的设计模式笔记(24)---访问者模式(行为型)的全部內容,希望文章能夠幫你解決所遇到的問題。

              如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。